定义long 型和int型或者char型所占的RAM是不是一样的?在M4中,因为M4是32位处理器位;
user3770609:
回复 Triton Zhang:
结构体可以定义多少个char型的数据
假如定义10个,每个占用的空间还是8位吗?
Triton Zhang:
回复 user3770609:
结构体可定义的字符变量没有限制,只要你选择了字节对齐,定义10个就占用10个8-BIT,如果你后面紧跟一个short,那就总共占12个BIT, 如果后面跟一个long,则中间两个字节空间就浪费了
yi zhao:
回复 Triton Zhang:
天啊,明显不是这样的啊,不要误人子弟
Triton Zhang:
回复 yi zhao:
YI ZHAO,
这是C语言和编译原理的基础知识,如果你觉得不对,请你指出不对的地方。如果你不清楚,请回去学习下基础知识。
Richard Ma:
根据处理器位数不同,一般长度变化的只有int型
因为M4是32位机,所以int = long = 4 bytes = 32 bits。16位机中int = short = 2 bytes = 16 bits。
char都是1 byte = 8 bits;short都是2 bytes = 16 bits;long都是4 bytes = 32 bits
yi zhao:
回复 Richard Ma:
呵呵,这个是正解
Triton Zhang:
回复 yi zhao:
这其实是两个概念,一个是变量占用空间,一个是编译器分配的空间。
变量占用空间只和变量的类型有关,编译器分配的空间和变量的类型以及定义的位置有关。
例如 按照如下定义的变量,在编译器中会按照下图分配空间:
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个字节的空间,而且空出来的两个空闲空间都是不会在分配给其他变量的.
但是如果你的代码选择了字节对齐,编译器就会按照最小字节对齐的方式来分配空间。带来的后果就是访问变量的负荷变大了。
具体就不分析了。
yi zhao:
回复 Triton Zhang:
人家的问题是普通变量的内存分配,又没有问你结构中的变量,
虽然你说的结构的对齐方式是对的,但也不免误人子弟
因为普通变量不是这么对齐的
TI中文支持网


