为什么C++;编译器内联字符串文本的一部分? 考虑这个小C++代码片段: #包括 #包括 int main(){ std::cout.这能回答你的问题吗?@PaulMcKenzie我确实读到过这方面的内容,但是,我无法说服自己,因为不同的大

为什么C++;编译器内联字符串文本的一部分? 考虑这个小C++代码片段: #包括 #包括 int main(){ std::cout.这能回答你的问题吗?@PaulMcKenzie我确实读到过这方面的内容,但是,我无法说服自己,因为不同的大,c++,g++,compiler-optimization,clang++,C++,G++,Compiler Optimization,Clang++,为什么C++;编译器内联字符串文本的一部分? 考虑这个小C++代码片段: #包括 #包括 int main(){ std::cout.这能回答你的问题吗?@PaulMcKenzie我确实读到过这方面的内容,但是,我无法说服自己,因为不同的大小,在这里起作用的是SSO。正如你在这里看到的,我看到的这种行为总是8+的倍数,在clang和gcc中是一致的,不依赖于大小:15/32/22/24H还有另一个例子:可能是为了减少可执行文件的大小,因为静态存储中的对象对齐以及寄存器的大小。这是

为什么C++;编译器内联字符串文本的一部分?

考虑这个小C++代码片段:

#包括
#包括
int main(){

std::cout.这能回答你的问题吗?@PaulMcKenzie我确实读到过这方面的内容,但是,我无法说服自己,因为不同的大小,在这里起作用的是SSO。正如你在这里看到的,我看到的这种行为总是8+的倍数,在clang和gcc中是一致的,不依赖于大小:15/32/22/24H还有另一个例子:可能是为了减少可执行文件的大小,因为静态存储中的对象对齐以及寄存器的大小。这是“加载已知值”优化的一个实例。因为编译器知道该值总是33,所以从内存加载它是没有意义的。
...

call    std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_create(unsigned long&, unsigned long)
mov     qword ptr [rsp + 16], rax
mov     rcx, qword ptr [rsp + 8]
mov     qword ptr [rsp + 32], rcx
movups  xmm0, xmmword ptr [rip + .L.str]
movups  xmmword ptr [rax], xmm0
mov     byte ptr [rax + 16], 33           <--------- !!!!!!!!!
mov     qword ptr [rsp + 24], rcx
mov     rax, qword ptr [rsp + 16]
mov     byte ptr [rax + rcx], 0

...

.L.str:
        .asciz  "This.String.Ends!"