完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
定义long 型和int型或者char型所占的RAM是不是一样的?在M4中,因为M4是32位处理器位;
|
|
相关推荐
15 个讨论
|
|
|
补充实例说明如下: stuct st_a [ char c[10]; short int s[3]; long int l[2]; long long ll;]stp;如果采用字节对齐的紧凑型编译,及定义了 __attribute__ ((aligned (1)));其 所占用内存空间为: 10*1 + 3*2 + 2*4 + 8*1 = 32个字节如果未定义字节对齐, 其所占的空间为: 10*1 + 2 + 3*2 + 2 + 2*4 + 8 = 36个字节,其中红色部分标注的是浪费的2个对齐空间。 如果定义一个字符变量和一个整形变量,编译器会自动使用R寄存器给你分配空间。如果定义到RAM区,编译器默认是4字节对齐的。
|
|
|
|
|
|
|
|
|
这其实是两个概念,一个是变量占用空间,一个是编译器分配的空间。 变量占用空间只和变量的类型有关,编译器分配的空间和变量的类型以及定义的位置有关。 例如 按照如下定义的变量,在编译器中会按照下图分配空间: static unsigned char val_chr[3]=[1,2,3]; static unsigned short int val_sht1=0; static unsigned long int val_long=0; 其中红色标注部分是变量占用空间,0x20000000-0X2000000B 是为这些变量分配的空间。 这两个值是不同的。如果用户在定义CHAR数组变量为CHR[4],编译器会分配给0X2000000-0X20000003, 这样CHAR数组的占用空间和分配空间是一致的. 但也有情况是变量占用空间和分配空间不一致的情况,例如上面的 short int 变量,就占用了4个位置,在后面定义的long int 变量就要跳过X20000006-0X20000007两个位置。用户如果在定义char 或short 变量,由于编译器会优化空间,所以把在6-7的位置分配给新定义的变量。 但是这种情况一旦变成义成结构体了,中间的空位置(上图中棕色的位置)就不会再被分配给其他变量。 这样结构体成员变量占用的实际有效地址空间,就和编译器分配给结构体的空间不一样了。 而且编译器会按照用户定义结构体成员变量的顺序去分配空间。例如如果你按照如下去定义结构体: typedef struct st [ unsigned char v1; unsigned short int v2; unsigned char v3; unsigned short int v4; ] ST_TEST; static ST_TEST kkk = [ 1,2,3,4 ]; 按照结构体成员变量的类型,所占用的实际有效的空间是 1+2+1+2 = 6, 而实际编译器就会如下去分配空间,总共占用了8个字节的空间,而且空出来的两个空闲空间都是不会在分配给其他变量的. 但是如果你的代码选择了字节对齐,编译器就会按照最小字节对齐的方式来分配空间。带来的后果就是访问变量的负荷变大了。 具体就不分析了。 |
|
|
|
|
|
|
|
|
很不想回你这样的帖子,想了半天想不出用什么来形容你了。只能建议你多花点时间去看点书。 贴主实际是问过结构体的字符变量占用空间的,你自己去看上面的问题。从第一个帖子的问题看,贴主根本搞不清楚到底是要问变量的空间和内存分配,他是把这两个问题混淆到一起的。而变量占用空间和内核是没有关系的。无论你用什么内核,char都是占用8-BIT, short int 都是占用2字节,long int 都是占用4字节,long long int 都是占用8字节。 而楼上有人在回"根据处理器位数不同,一般长度变化的只有int型".这句话在你看来也许是对的,其实这个是有问题的。 C语言的基本类型有void, char, int, float, double 5种,但这5个数据类型是不能单独使用的,需要用类型修饰关键字,例如signed, unsigned, long, short等才能准确地告诉编译器我们的实际的变量类型。那为什么我们实际编程的时候有时候就只写int或者char就行了呢? 因为编译器会默认的认为int是unsigned或是signed, 是long 或是short.这个是和内核无关的,与你用的32-BIT的内核还是16位的内核都无关,只和编译器相关。所以有的编译器会给出一个选项,让你自己选默认的int是short还是long,char是unsigned还是signed. 回到开始的问题,又要反驳你的论点了. 无论普通变量的内存分配,还是结构体的变量分配,都是一样的,都是编译器对你的变量定义进行地址分配。 他们的基本原理都是一样的。如果只考虑变量占用的空间,而不考虑编译器的操作,那说明你还需要修炼。 以KEIL的编译器为例子,如下图所示的两组变量定义:(其他编译器也大同小异) 上图中定义了相同的两组变量,区别是定义的相对位置不一样,但编译器对他们的地址分配完全不同,这是为什么呢? 因为编译器会按照他自己的方法顺序地给变量分配空间。 有时候我们见到的情况又不是这样的,那是为什么呢? 因为在上面的定义中,我选择了无优化?而一旦我们选用了优化级别,编译器就会按照优化的类型重新分配。选择时间优化或空间优化都可能影响到变量的空间分配。就相当于我们在定义结构体时选择字对齐还是字节对齐。 说到底,是殊途同归的事,关键是看你有悟性悟出这些道理。 看了这些,你觉得是谁在误认子弟呢? 回到开始,我还是建议你多看点书再下结论。 |
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
550 浏览 0 评论
1613 浏览 0 评论
2047 浏览 0 评论
为啥BQ7693003DBTR芯片在和BQ769X0盒子通讯时收不到信号?
1514 浏览 0 评论
DSP 28027F 开发板 XDS100v2调试探针诊断日志显示了 Error -150 (SC_ERR_FTDI_FAIL)如何解决
1338 浏览 0 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
1757浏览 29评论
2783浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
1724浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
1634浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
1645浏览 13评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 15:42 , Processed in 1.281768 second(s), Total 87, Slave 73 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1608