C ++中的int和const int

时间:2017-04-30 16:54:17

标签: c++ arduino

当我问到C ++中int和const之间有什么不同? 有人这样说。

  

可以在需要时修改int,它是读/写,并且const int是只读的。(可以动态更改)。您可以将const int用于类似固定值的内容,并且const int内存使用量小于普通int。

C ++中是否真的 const int内存使用率低于普通int。

4 个答案:

答案 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。

为什么要用它?要强制执行A​​PI,请指明... ...

答案 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>