我看看在每个这些技术所产生的组件中,使用下面的程序:
#include <new>
char blob[128];
int main() {
void *pLocation = blob;
char pattern = 'x';
#ifdef CAST
*reinterpret_cast<char*>(pLocation) = pattern;
#else
::new(pLocation) char(pattern);
#endif
}
我使用克++ 4.4.3 Linux上的64位与默认编译器标志。
的ASM为放置新相关部分:
movb $120, -1(%rbp)
movq -16(%rbp), %rax
movq %rax, %rsi
movl $1, %edi
call _ZnwmPv
movq %rax, %rdx
testq %rdx, %rdx
je .L5
movzbl -1(%rbp), %edx
movb %dl, (%rax)
.L5:
从我所收集,这实际上是调用放置新的运营商,并检查它的返回值,即使它总是成功的。然后继续将x
的值写入返回的内存中。
而对于reinterpret_cast
:
movb $120, -1(%rbp)
movq -16(%rbp), %rax
movzbl -1(%rbp), %edx
movb %dl, (%rax)
注意,这些说明是相同的前两个和最后两个位置new
版本。
使用-O1
,代码两片产生相同组件:
movb $120, blob(%rip)
所以,如果你担心性能,不要。任何其他理智的编译器都可能会同时减少相同的代码。
不确定你想在这里实现什么,但'pattern'不会被复制到第一个示例中的'pLocation' - 你可以将它替换为'pLocation = pattern;'如果你只是看用于指针分配。 – adamk 2010-08-01 07:43:03
模式是字符。它将被复制到pLocation所指向的任何位置,代码将按照预期编译和工作。在这种情况下,两种说法都是相同的。 – aCuria 2010-08-01 07:56:28
在这两种情况下,请谨慎对待pLocation是否与您的平台上的任何字边界限制保持一致。例如,你可能能够在任何地方放置一个'char',但你可能无法在任何地方放置一个“长”,除了其大小的倍数的地址。 – 2010-08-01 13:29:53