kap*_*dit 0 c macros c-preprocessor
致力于优化代码。将宏类型转换char为减少内存消耗是个好主意吗?这样做可能有什么副作用?
例子:
#define TRUE 1 //non-optimized code
sizeof(TRUE) --> 4
#define TRUE 1 ((char) 0x01) //To optimize
sizeof(TRUE) --> 1
#define MAX 10 //non-optimized code
sizeof(MAX) --> 4
#define MAX ((char) 10) //To optimize
sizeof(MAX) --> 1
Run Code Online (Sandbox Code Playgroud)
它们对内存消耗几乎没有影响。
这些宏提供要在表达式中使用的值,而实际内存使用量(大致)由变量的类型和数量以及动态分配的内存决定。因此,您可能有TRUEasint或 as a char,但真正重要的是它(或它出现的表达式)被分配给的变量类型,这不受常量类型的影响。
这些常量的类型可能具有的唯一影响是它们所使用的表达式的执行方式 - 但即使这种影响也应该几乎不存在,因为 C 标准(简化)在之前隐式地提升int或unsigned所有较小的类型执行几乎任何操作。1
所以:如果你想减少你的内存消耗,不要看你的常量,而是看你的数据结构,可能是全局的和动态分配的2!也许你有大量的double值,其中的精度float足够了,也许你保存大数据的时间比你需要的时间长,或者你有内存泄漏,或者一个大数组的布局struct不当,或布尔值当它们可以是位域时,它们是 4 字节宽的 - 这是您应该关注的事情,绝对不是这些#defines。
这个想法是积分运算在本机寄存器大小下执行,传统上对应于int. 此外,即使这条规则不正确,在大量寄存器溢出的情况下,改变表达式中整数临时值的大小的唯一记忆效应可能最多是增加一点堆栈使用量(通常大部分都是预先分配的) .
在堆栈上分配的内容通常没有问题 - 如上所述,它通常是预先分配的,如果您用尽它,您的程序就会崩溃。