首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::copy/memcpy/memmove优化

std::copy/memcpy/memmove优化
EN

Stack Overflow用户
提问于 2012-01-19 00:32:09
回答 2查看 1.2K关注 0票数 7

我研究了一下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来说不是微不足道的。有什么想法吗?

代码语言:javascript
复制
#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;
} 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-19 00:58:14

关于trivial是什么意思,一直存在一些争论。

例如,据我所知,您的示例并不是可以构造的(我认为std::is_trivially_default_constructible会返回false )。

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

票数 5
EN

Stack Overflow用户

发布于 2012-01-19 00:33:47

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

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8913747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档