Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1062302
  • 博文数量: 264
  • 博客积分: 6005
  • 博客等级: 大校
  • 技术积分: 2798
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-08 20:15
文章分类

全部博文(264)

文章存档

2011年(42)

2010年(213)

2009年(4)

2008年(2)

2007年(3)

分类: C/C++

2011-05-23 17:46:10

看stm32厂商的源代码中用到了非常多的#define,很自然的会问#define是否占用内存。
eg:
/* Flash Control Register bits */
#define CR_PG_Set                ((uint32_t)0x00000001)
#define CR_PG_Reset              ((uint32_t)0x00001FFE)
#define CR_PER_Set               ((uint32_t)0x00000002)
#define CR_PER_Reset             ((uint32_t)0x00001FFD)

=======================================================
回答1.(猜测性的回答)
我想stm32飞07的芯片内存只有10几K,如果#define 占用内存的话,肯定是内存不够的。
所有#define是不占据内存的。

回答2.(理论上)
#define 理论上是在编译器编译的时候直接替代成具体的值的。
换句话说#define 必需是明确的东西,不能是变化的。更好理解的是#define 相当于取一个别名。
例如,我们给李晓明取一个昵称,叫妞妞, 当李晓明听到妞妞时,就知道是叫自己。仅此而起。
#define   妞妞   李晓明


回答3(实验,实验环境 VS2010 控制台程序)
猜测和理论上都讨论过了,现在是验证性的证明。
程序代码如下
  1. #include "iostream"

  2. using namespace std;
  3. #define MAX_VALUE 23

  4. int main()
  5. {
  6.     int c = 100;
  7.     int a = MAX_VALUE;
  8.     int b = a;

  9.     getchar();
  10.     return 1;
  11. }
我们在c,a,b上设置断点,单步跟踪,然后我们查看c,a,b的变量值。
选择变量c然后右键点击《添加监视(W)》 我们可以看到 a,b,c都是可以被监视的,说明a,b,c是在内存中存在的。 MAX_VALUE 是不能被监视的。 说明在内存中是不存在的。
如果你认为上面的还不能证明的话,那我们来看看汇编,按 ALT + 8
  1. #include "iostream"

  2. using namespace std;

  3. #define MAX_VALUE 23

  4. int main()
  5. {
  6. 00C313B0 push ebp
  7. 00C313B1 mov ebp,esp
  8. 00C313B3 sub esp,0E4h
  9. 00C313B9 push ebx
  10. 00C313BA push esi
  11. 00C313BB push edi
  12. 00C313BC lea edi,[ebp-0E4h]
  13. 00C313C2 mov ecx,39h
  14. 00C313C7 mov eax,0CCCCCCCCh
  15. 00C313CC rep stos dword ptr es:[edi]
  16. int c = 100;
  17. 00C313CE mov dword ptr [c],64h
  18. int a = MAX_VALUE;//我们看这一行的代码转化成汇编就是下一行(00C313D5),直接用17h代替了MAX_VALUE。
  19. 00C313D5 mov dword ptr [a],17h
  20. int b = a;
  21. 00C313DC mov eax,dword ptr [a]
  22. 00C313DF mov dword ptr [b],eax

  23. getchar();
  24. 00C313E2 mov esi,esp
  25. 00C313E4 call dword ptr [__imp__getchar (0C382D4h)]
  26. 00C313EA cmp esi,esp
  27. 00C313EC call @ILT+300(__RTC_CheckEsp) (0C31131h)
  28. return 1;
  29. 00C313F1 mov eax,1
  30. }
  31. 00C313F6 pop edi
  32. 00C313F7 pop esi
  33. 00C313F8 pop ebx
  34. 00C313F9 add esp,0E4h
  35. 00C313FF cmp ebp,esp
  36. 00C31401 call @ILT+300(__RTC_CheckEsp) (0C31131h)
  37. 00C31406 mov esp,ebp
  38. 00C31408 pop ebp
  39. 00C31409 ret
  40. --- 无源文件 -----------------------------------------------------------------------
  41. 00C3140A int 3
  42. 00C3140B int 3
  43. 00C3140C int 3


看到这里,各位看官已经完全可以大胆的在嵌入式中使用很多的#define 不用担心吃掉你的内存。
阅读(4382) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~