【发布时间】:2020-09-30 16:15:21
【问题描述】:
g++ 编译器是否将*&x 替换为x?
在以下情况下会这样做吗?
int x;
template <int *ptr>
void print_var(){
printf("%d\n", *ptr);
}
main(){
print_var <&x> ();
}
【问题讨论】:
-
您的示例中没有
*&。
g++ 编译器是否将*&x 替换为x?
在以下情况下会这样做吗?
int x;
template <int *ptr>
void print_var(){
printf("%d\n", *ptr);
}
main(){
print_var <&x> ();
}
【问题讨论】:
*&。
是的。只要语义相同,C++ 标准就允许编译器进行任何优化。它被称为 as-if 规则: https://en.cppreference.com/w/cpp/language/as_if
在实践中,编译器在积极内联实例化模板代码并简化它方面做得很好。让我们看看 x86-64 程序集 g++ 为更简单的测试用例生成了什么: https://godbolt.org/z/x5rreG
#include <stdio.h>
int x;
template <int *ptr>
void print_var(){
printf("%d\n", *ptr);
}
void test(){
print_var <&x> ();
}
生成的程序集是这样的:
.LC0:
.string "%d\n"
test():
mov esi, DWORD PTR x[rip] ; pass x to printf
mov edi, OFFSET FLAT:.LC0 ; pass "%d\n" to printf
xor eax, eax ; return value register
jmp printf ; call
x:
.zero 4
编译器不会浪费任何指令单独存储指针并取消引用它。
【讨论】: