当我问到C ++中int和const之间有什么不同? 有人这样说。
可以在需要时修改int,它是读/写,并且const int是只读的。(可以动态更改)。您可以将const int用于类似固定值的内容,并且const int内存使用量小于普通int。
C ++中是否真的 const int内存使用率低于普通int。?
答案 0 :(得分:6)
可能会也可能不会,取决于它的使用方式。大多数编译器非常聪明,如果他们不需要它,就不会为const
对象创建存储空间。所以,例如:
void f() {
const int arr_size = 10;
int arr[arr_size];
// do something with arr
}
这里,arr_size
的唯一用途是指定数组的大小。没有必要为此创建int
对象;编译器只是创建一个大小为10的数组。
另一方面:
void f(const int* ip) {
// do something with ip
}
int main() {
const int n = 100;
f(&n);
return 0;
}
这里,编译器必须为int
创建一个n
对象,因为代码的地址为n
。
答案 1 :(得分:2)
Const是一个让变量无法分配的东西。这是防止违反预期约束的高级别的事情。除非实际常量,否则您不会注意到任何效果。 (我建议改用constexpr)
这会影响记忆吗?不,简单地添加const不会改变int(或任何其他类)的任何内容。
这有助于优化吗?不,编译器足够智能,如果你没有它,就可以自行推断出constness。
为什么要用它?要强制执行API,请指明... ...
答案 2 :(得分:2)
在C ++中,除非采用const
变量的地址,否则将其视为文字常量并插入到代码中,就好像它的值已按字面输入一样。也就是说:
const int BUFFLEN = 16 ;
char buffer[BUFFLEN] ;
将生成与以下相同的代码:
char buffer[16] ;
const BUFFLEN在内存映射中不作为单独的对象存在,除非显式引用它的地址,例如:
printf( "%p", &BUFFLEN ) ;
如果未引用其地址,则生成的代码将小于特定地址中存在的代码,并且每次使用时都必须将其提取并加载到寄存器中。
此外,R / W内存中不得存在非常量int
,但如果它具有const初始化器,则该初始化值也必须存在于代码空间中。例如:
int foo = 16 ;
将占用RAM中的空间并将初始化值存储在ROM(在Arduino的情况下)中,该值在主要或任何全局静态对象构造函数之前的启动时复制到RAM中。
所以是的,const
确实可能比非const消耗更少的资源。但我认为这是const
语义的一种副作用,而不是它的目的。
答案 3 :(得分:1)
使用相同数量的内存,因为它们都分配了int的大小。使用const的唯一原因当然是为某个不会发生变化的引脚或值定义一个常量。 int
可以读写,const int
可以读取。 const int
节省空间的原因是因为编译器处理是一个不会改变的值,因此它不会进行任何调整以允许它修改其值,从而节省内存。 / p>