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