c++ - C ++:编译期间的int计算(而不是运行期间)
问题描述
简单的问题:
为什么下面的代码有效?
int main() {
const int a = 4;
const int b = 16;
const int size = b/a;
int arr[size] = {0,1,2,3};
return 0;
}
我认为静态数组的大小必须在编译时定义,因此只能使用“int”文字。在上面的代码中,尽管大小是一个计算,但代码会编译。这个计算是在编译期间完成的吗?
如果是,也许我对编译和运行的理解是错误的:编译只是通过语法并将代码转换为机器代码,但不进行任何计算......
谢谢!
解决方案
这个计算是在编译期间完成的吗?
是的,编译器为你做了很多优化和计算,你的代码中的初始化即使没有任何优化也是可以的,这是编译器预先计算的结果。
一般来说,这里的计算包括constexpr
,const
类型声明等,它们已经在语言本身的定义中(见常量表达式)。
只需查看示例的输出即可。
constexpr 说明符声明可以在编译时计算函数或变量的值。
这就是数组的初始化方式,数组声明如下:
noptr 声明符 [ expr(可选) ] attr(可选)
这里expr
是:
整数常量表达式 (C++14 前) std::size_t (C++14 起)类型的转换常量表达式,其计算结果大于零
它们都是常量表达式,它说:
一个可以在编译时求值的表达式。
所以,使用所谓的预计算来初始化一个数组是可以的。
这里还有一个后续:还有很多方法可以通过让它们在编译时完成来节省更多计算和时间,它们在上面的链接中显示。
只是提一些不同的东西:至于优化,您可以看到 version 的汇编代码之间的差异,-O0
并且-O3
在计算从 1 到 100 的总和时,这是一个令人大吃一惊的东西——您会看到结果 5050 在汇编代码中在-O3
版本中,它也是一种编译时计算,但不是针对各种情况启用的。
推荐阅读
- c# - 是否可以不加载某些 NuGet 依赖项?
- html - 如何停止列拆分单个元素
- excel - 嵌套的 IF(AND(ISBLANK)) 语句不起作用?
- c - 为结构中的结构数组动态分配内存
- ios - 带有 UILabel 内容的 UITableViewCell 在滚动时发生变化
- android - 将搜索视图小部件放在工具栏的右上角
- sql-insert - 计算字段 - 插入 m2m 关系表
- asp.net-core-2.0 - 使用 DI 的 ASP.NET CORE 2.0 运行时值
- php - 如何在codeigniter的td列中显示静态值
- python - print_at - 使用字符串以外的变量