C++ 中的值赋值:运行时或编译时

Values assignment in C++: runtime or compile time

提问人:Nikita 提问时间:10/3/2023 更新时间:10/3/2023 访问量:88

问:

我知道这会产生一个常量,该值始终在编译时创建。但是普通变量呢?如果我这样做constexprint x = 1

值是在编译时还是运行时分配给此变量?

C++ 变量

评论

1赞 Some programmer dude 10/3/2023
生成它,并查看生成的汇编代码。检查未优化和优化的构建。
1赞 Some programmer dude 10/3/2023
还有一点挑剔:没有赋值,它是 .int x = 1;x
1赞 463035818_is_not_an_ai 10/3/2023
stackoverflow.com/questions/15718262/......
0赞 BoP 10/3/2023
您知道 using 是使它成为编译时的方法。所以如果你只是使用,你显然不在乎。那么,当你告诉编译器你不在乎时,你为什么要在乎编译器做了什么呢?:-)constexprint x = 1;

答:

0赞 463035818_is_not_an_ai 10/3/2023 #1

这里要考虑的重要事项是假设规则。有关详细信息,我建议您参阅“假设”规则到底是什么?。简而言之,它说编译器生成的程序必须具有相同的可观察行为,就好像它从字面上遵循您在代码中编写的内容一样。除此之外,编译器可以进行任何它认为适用的优化。

int x = 1;没有可观察到的行为。如果从未使用过,则编译器可以自由地不发出与此行相对应的代码,这些代码将在运行时执行。如果编译器可以看到它从未使用过,它也不能在编译时初始化某些变量。您需要考虑上下文才能理解编译器优化,因为编译器在应用优化时会考虑上下文。xx1

但是,这里不是一个恒定的表达式。即使编译器在编译时使用 进行初始化,也无法在需要常量表达式(数组大小、模板参数等)的情况下使用。int x = 1;xx1x