分配铸造指针或memcpy

时间:2014-07-16 21:54:02

标签: c++ memcpy reinterpret-cast

假设内存与操作完全一致,T是基本类型(intfloatdouble,等等,这些操作中的哪一个在最高优化级别的大多数编译器上更高效? :

void *memory = ::operator new(sizeof(T));
*reinterpret_cast<T*>(memory) = some_func();

void *memory = ::operator new(sizeof(T));
T i = some_func();
std::memcpy(memory, &i, sizeof(T));

Instinct告诉我们第一个会更快(没有临时值存储)但我确信现代编译器会优化它。

我觉得好像第一个操作在逻辑上更有意义(为一个位置赋值)但不适用于需要复制多个值的大型数据集,但我只是想知道像我这样的简单操作示例

修改
鉴于我自己的情况,我永远不会故意做这样的事情,但我正在使用提供malloc ed缓冲区的第三方API,我想要做的就是修改前四个字节以便整数值放在那里

2 个答案:

答案 0 :(得分:0)

当没有将每个示例放在循环中时,运行循环1,000,000次并查看哪一个更快。确保您在发行版中编译;)

答案 1 :(得分:-1)

Assignment是一种语言结构,对编译器可见,并且可以与some_func()中的对象结构组合进行优化。 memcpy()是一个带有原始内存操作的“隔离”函数。

第一个例子将高度依赖于some_func()内部。现代C ++ 11/14结构包括复制和移动操作,可以帮助优化器。