对const和#define内存占用理解

本文详细解析了C语言代码与汇编视图的区别,着重阐述了const与#define的作用,以及在实际代码执行过程中的内存分配情况。通过对i, j, k, l变量的赋值分析,深入理解编译过程中的常量与符号替换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过以下代码分析:

 

const int c = 5;
#define	N 6

void main()
{
	int i;
	int j;
	int k;
	int l;

	i = c;
	j = c;
	k = N;
	l = N;

	return 0;
}


 

 

汇编视图:

3:    const int c = 5;
4:    #define N 6
5:
6:    void main()
7:    {
0040D730   push        ebp
0040D731   mov         ebp,esp
0040D733   sub         esp,50h
0040D736   push        ebx
0040D737   push        esi
0040D738   push        edi
0040D739   lea         edi,[ebp-50h]
0040D73C   mov         ecx,14h
0040D741   mov         eax,0CCCCCCCCh
0040D746   rep stos    dword ptr [edi]
8:        int i;
9:        int j;
10:       int k;
11:       int l;
12:
13:       i = c;
0040D748   mov         eax,[_c (0042201c)]
0040D74D   mov         dword ptr [ebp-4],eax
14:       j = c;
0040D750   mov         ecx,dword ptr [_c (0042201c)]
0040D756   mov         dword ptr [ebp-8],ecx
15:       k = N;
0040D759   mov         dword ptr [ebp-0Ch],6
16:       l = N;
0040D760   mov         dword ptr [ebp-10h],6
17:
18:       return 0;
19:   }


可以看出,const是在内存中分配了一个地址,而#define仅仅是在编译时做了替换,没有在内存中分配.在最后生成的代码中,#define被保存为若干个立即数,占用的是ROM,

而const是在运行时占用了一个RAM空间. i, j, k, l在运行时肯定都是要分配内存的.

 

对于百度百科里面的解释不知道该如何理解:

 

 

应该是#define在代码区有若干份拷贝吧?

 

这段代码定义了一系列宏(`BIT0`到`BIT31`),用于**位操作**,目的是通过预定义的十六进制常量快速访问或操作整数的特定位。以下是详细解析: --- ### **作用** 1. **位掩码(Bitmask)** 每个宏对应一个二进制位(从最低位`BIT0`到最高位`BIT31`),值为`1`左移对应位数的结果(如`BIT3=0x08`即二进制的`00001000`)。 - 用途:通过按位与(`&`)、或(`|`)、异或(`^`)等操作,快速检查、设置或清除特定位。 2. **简化硬件寄存器操作** 在嵌入式开发中,常需直接操作硬件寄存器的特定位(如控制GPIO、中断使能等)。这些宏可以避免手动计算位掩码,提高代码可读性。 --- ### **示例场景** 假设有一个32位寄存器`REG`,需要操作其第5位(`BIT5`): ```c REG |= BIT5; // 将第5位置1(设置位) REG &= ~BIT5; // 将第5位清0(清除位) if (REG & BIT5) { ... } // 检查第5位是否为1 ``` --- ### **代码结构分析** 1. **分组注释** - `//??µÍËÄλ`(可能是乱码,应为“低四位”)`//??¸ßËÄλ`(“高四位”)是注释,但实际定义的宏覆盖了全部32位(可能是代码片段不完整)。 - 正确的分组应为: - `BIT0`-`BIT3`:最低4位(但代码中`BIT4`开始被标记为“高四位”,可能是注释错误)。 - `BIT4`-`BIT7`:次低4位。 - 以此类推,每4位一组。 2. **宏定义规律** 每个宏的值是前一个的2倍(即左移1位): ```c #define BIT0 0x01 // 1 << 0 #define BIT1 0x02 // 1 << 1 #define BIT2 0x04 // 1 << 2 ... #define BIT31 0x80000000 // 1 << 31 ``` --- ### **为什么需要这么多位?** 1. **支持32位系统** 现代MCU常用32位寄存器,需要完整的32位掩码。 2. **统一风格** 即使某些位在当前项目中未使用,预定义所有位可以方便后续扩展或兼容其他硬件。 --- ### **潜在问题** 1. **注释错误** `//??µÍËÄλ``//??¸ßËÄλ`可能是编码问题,正确注释应明确位范围(如“Bits 0-3”)。 2. **冗余定义** 如果项目仅用部分位(如仅`BIT0`-`BIT7`),定义全部32位会占用更多预处理内存,但通常影响可忽略。 --- ### **总结** 这些宏是**位操作的工具集**,用于: - 快速生成位掩码。 - 简化硬件寄存器操作。 - 提高代码可读性可维护性。 在嵌入式开发中,这种写法非常常见,尤其是需要直接操作寄存器或状态标志时。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值