关于C ++中的arduino:int和const int

int and const int in C++

当我问到C ++中int和const有什么区别吗?
有人这样说。

An int can be modified when you need, it is read/write and a const int is read only.(can change dynamically). You can use a const int for something like fixed value, and const int memory usage is less than normal int.

真正的const int内存使用量是否小于普通int。 在C ++中?


可能会或可能不会,取决于使用方式。大多数编译器非常聪明,它们不需要为const对象创建存储。因此,例如:

1
2
3
4
5
void f() {
    const int arr_size = 10;
    int arr[arr_size];
    // do something with arr
}

在这里,arr_size的唯一用途是指定数组的大小。无需为此创建一个int对象。编译器仅创建一个大小为10的数组。

另一方面有:

1
2
3
4
5
6
7
8
9
void f(const int* ip) {
    // do something with ip
}

int main() {
    const int n = 100;
    f(&n);
    return 0;
}

在这里,编译器必须为n创建一个int对象,因为代码采用的地址为n


在C ++中,除非使用const变量的地址,否则将其视为文字常量,并将其插入到代码中,就好像其值是按字面值输入的一样。也就是说:

1
2
const int BUFFLEN = 16 ;
char buffer[BUFFLEN] ;

将生成与以下代码相同的代码:

1
char buffer[16] ;

const BUFFLEN在内存映射中不作为单独的对象存在,除非明确引用其地址,例如:

1
printf("%p", &BUFFLEN ) ;

假设未引用其地址,则生成的代码将比其存在于特定地址中的代码小,并且每次使用时都必须将其提取并加载到寄存器中。

此外,R / W存储器中不必存在非常量int,但是如果它具有常量初始化程序,则该初始化值也必须存在于代码空间中。因此,例如:

1
int foo = 16 ;

将消耗RAM中的空间,还将初始化值存储在ROM中(对于Arduino)(在Arduino的情况下),该值在启动时复制到RAM之前,主要或任何全局静态对象构造函数中。

因此,是的,const确实有可能比非常量消耗更少的资源。但是我想这是const语义的副作用,而不是其目的。


常量是使变量不可分配的意思。防止违反预期的约束是一种高水平的事情。您不会注意到任何影响,除非是实际常数。 (在这里我建议使用constexpr代替)

这会影响记忆力吗?不,仅添加const不会更改int(或任何其他类)的任何内容。

这将有助于优化吗?不,编译器足够聪明,可以在没有常量的情况下自行推断出常量。

为什么要使用它?要强制执行A??PI,请说明意图...


使用相同数量的内存,因为它们都分配int的大小。使用const的唯一原因当然是为不会改变的特定引脚或值定义一个常数。 int可以读写,const int只能读取。 const int节省空间的原因是因为编译器对待的是不会改变的值,因此它不会进行任何允许其修改值的调整,从而节省了内存。