gpt4 book ai didi

c++ - 在 C++ 类中折叠断言?

转载 作者:行者123 更新时间:2023-11-30 02:12:43 25 4
gpt4 key购买 nike

所以,在非类情况下,我可以这样做:

int val_to_check = 0;

int some_func(int param) {
assert(val_to_check == 0);
return param*param+param;
}

int main() {
printf("Val: %i\n", some_func(rand()));
return 0;
}

如果 val_to_check 被声明为 const,则断言可以被编译器折叠掉。

我很好奇是否有可能对类的成员变量进行类似的常量折叠。例如,我可以做类似的事情吗:

class Test {
public:
Test(int val) : val_(val) {}
int some_func(int param) {
assert(val_ == 0);
return param*param+param;
}
private:
const int val_;
};

因此在定义类时必须知道 val_,a-la:

  Test my_test(0);
printf("Val: %i\n", my_test.some_func(rand()));

(我知道这些都是人为的例子)。有时似乎应该可以将断言折叠起来,但我测试过的简单示例似乎并没有这样做。我得到的最好的结果是将断言代码移动到函数的末尾(在使用 -O3 进行编译时)

最佳答案

在您提供的类示例中,编译器无法假定常量为零,因为您有两个运行时变量:

  • 您的 const int val_ 只是类的每个实例的常量,因此它永远无法优化类的函数代码,因为它必须满足每种情况。
  • 示例实例化不提供文字常量,它提供可变的 rand() 结果。如果它知道提供给该类的所有实例的唯一 val_ 为零,它可能可能对其进行优化。

您是否尝试过向构造函数提供一个常量以查看它是否对其进行了优化?

关于c++ - 在 C++ 类中折叠断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1485044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com