我看看在每個這些技術所產生的組件中,使用下面的程序:
#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