我利用以下方案审视了这些技术的生成组合:
#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
}
I m 采用4.4.3g++,在有违约汇编旗的六氯环己烷64轨道上使用。
The relevant part of the asm for placement new:
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的数值写入交还的记忆中。
<<><>>t>reinterpret_cast:
movb $120, -1(%rbp)
movq -16(%rbp), %rax
movzbl -1(%rbp), %edx
movb %dl, (%rax)
请注意,这些指示与前两个和最后两个位置:<编码>新代码>。
使用<代码>-O1,两种代码生成i Equal。 集会:
movb $120, blob(%rip)
因此,如果你重新担心业绩,就没有。 任何其他电解机也可能将两者都减至相同的代码。