【问题标题】:Does g++ compiler simplify expressions? [closed]g++ 编译器是否简化表达式? [关闭]
【发布时间】: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> ();
}

【问题讨论】:

  • 您的示例中没有*&amp;

标签: c++ templates g++


【解决方案1】:

是的。只要语义相同,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

编译器不会浪费任何指令单独存储指针并取消引用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-23
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 2012-02-12
    • 2019-06-22
    相关资源
    最近更新 更多