【问题标题】:std::copy/memcpy/memmove optimizationsstd::copy/memcpy/memmove 优化
【发布时间】:2012-01-18 16:32:08
【问题描述】:

我查看了 GCC STL (4.6.1),发现 std::copy() 使用优化版本,以防内置 __is_trivial() 评估为 true

由于std::copy()std::reverse_copy() 模板对于复制数组中的元素非常有用,我想使用它们。但是,我有一些类型(它们是模板实例化的结果),它们是包含一些琐碎值、没有指针并且没有复制构造函数或赋值运算符的结构。

G++ 是否足够聪明,能够发现我的类型实际上是微不足道的? C++98 中是否有任何方法可以确保 STL 实现知道我的类型是微不足道的?

我猜想在 C++11 中,使用 is_trivial<> 类型特征会变得很方便。是这样吗?

谢谢!

编辑:很抱歉这么晚了,但这里有一个非常简单的Type 类的例子,它对 GCC 和 llvm 来说不是微不足道的。有什么想法吗?

#include <iostream>

struct Spec;

template <typename TValue, typename TSpec>
class Type
{
public:
    TValue value;

    Type() : value(0) {}
};

int main()
{
    std::cerr << "__is_trivial(...) == "
              << __is_trivial(Type<char, Spec>) << '\n';                                                                                                                                                                                                                                    
    return 0;
} 

【问题讨论】:

  • C++03 POD 也禁止默认构造函数,如果我记得的话,这可能是防止它变得微不足道的原因。
  • @MooingDuck:谢谢,我想这就是解释。连同马修的回答,这回答了我的问题。

标签: c++ stl c++11 c++98


【解决方案1】:

关于trivial 的含义存在一些争论。

例如,据我所知,您的示例并非易构建(我认为std::is_trivially_default_constructible 会返回 false)。

在你的情况下,我认为你需要新的特征std::is_trivially_copyable,它更细粒度。所以...升级你的编译器?

【讨论】:

    【解决方案2】:

    __is_trivial 为所有类型提供正确的值。

    您不能依赖任何特定的 STL 实现来使用它,尽管如果编译器供应商提供了它,那么它可能确实包含各种特定于编译器的幕后改进。

    C++11 的std::is_trivial 只是对这个特性进行了标准化,实现没有理由不使用它。

    【讨论】:

    • 显然,__is_trivial 无法推断出一个类型是否可以简单地复制。 :( 请参阅我的更新中的示例。
    猜你喜欢
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 2019-12-27
    • 2019-04-28
    • 2013-11-05
    • 2011-06-10
    相关资源
    最近更新 更多