Анти-оптимизированный вывод asm отладочной сборки MSVC, как правило, даже более интеллектуален, чем анти-оптимизированные сборки gcc или clang.
Нет разумной причины проливать / перезагружать возвращаемое значение в стек даже вотладочная сборка : временная версия не доступна через какое-либо имя в абстрактной машине C ++, и нет никакой отладочной информации, которая позволяла бы видеть ее между концом new
и обновлением p
.
int*
- это типично копируемый тип, поэтому при копировании возвращаемого значения в локальный тип нет конструктора копирования.Но, вероятно, именно поэтому MSVC делает это.
gcc не делает этого внутри функции или в функции статического инициализатора, если вы поместите этот new
в глобальную область видимости.https://godbolt.org/z/51SM3N
Если вы не хотите смотреть на тупую асимметрию мозга, скомпилируйте с включенной оптимизацией , например -O2
или -Ox
в MSVC.Затем вы получите ожидаемый статический инициализатор:
;;; x86 MSVC -O2 output
??__Ep@@YAXXZ PROC ; ??__Ep@@YAXXZ, COMDAT
push 4
call void * operator new(unsigned int) ; operator new
add esp, 4
mov DWORD PTR int * p, eax ; p
ret 0
или для x86-64,
?__Ep@@YAXXZ PROC ; ??__Ep@@YAXXZ, COMDAT
sub rsp, 40 ; 00000028H
mov ecx, 4
call void * __ptr64 operator new(unsigned __int64) ; operator new
mov QWORD PTR int * __ptr64 __ptr64 p, rax ; p
add rsp, 40 ; 00000028H
ret 0