我强烈怀疑它,因为它改变了内存布局(一个有一个空终止符,另一个没有),而且因为它会涉及改变文字的实际类型(并且,通过扩展,改变被调用的函数)。因此,在绝大多数情况下,这将是无效的转变,对极少数情况下的帮助还不够。
That said, if the compiler does enough aggressive inlining (inlining the function itself and the constant data into the function), you might end up with effectively the same code. For example, Clang compiles the following:
#include <iostream>
using namespace std;
int main() {
cout << "X" << "\n";
cout << "Y" << '\n';
}
into this:
movq std::cout@GOTPCREL(%rip), %rbx
leaq L_.str(%rip), %rsi
movq %rbx, %rdi
movl $1, %edx
callq std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
leaq L_.str1(%rip), %rsi
movq %rbx, %rdi
movl $1, %edx
callq std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
leaq L_.str2(%rip), %rsi
movq %rbx, %rdi
movl $1, %edx
callq std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
leaq -9(%rbp), %rsi
movb $10, -9(%rbp)
movq %rbx, %rdi
movl $1, %edx
callq std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
xorl %eax, %eax
addq $8, %rsp
popq %rbx
popq %rbp
As you can see, inlining has made the two cases nearly identical. (And, in fact, the '\n'
case is slightly more complex because the character has to be put on the stack.)