定义long 型和int型或者char型所占的RAM是不是一样的?在M4中,因为M4是32位处理器位;
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
定义long 型和int型或者char型所占的RAM是不是一样的?在M4中,因为M4是32位处理器位;
如果你在代码中定义一个单独的Long int 或者Short int,或者char, 在RAM中都会占用一个32-bit的空间。
如果你是定义一个结构体,你可以选择对齐方式来定义,这样的char可以做到只用8-Bit.
结构体可以定义多少个char型的数据
假如定义10个,每个占用的空间还是8位吗?
结构体可定义的字符变量没有限制,只要你选择了字节对齐,定义10个就占用10个8-BIT,如果你后面紧跟一个short,那就总共占12个BIT, 如果后面跟一个long,则中间两个字节空间就浪费了
补充实例说明如下:
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字节对齐的。
根据处理器位数不同,一般长度变化的只有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
这其实是两个概念,一个是变量占用空间,一个是编译器分配的空间。
变量占用空间只和变量的类型有关,编译器分配的空间和变量的类型以及定义的位置有关。
例如 按照如下定义的变量,在编译器中会按照下图分配空间:
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的编译器为例子,如下图所示的两组变量定义:(其他编译器也大同小异)
上图中定义了相同的两组变量,区别是定义的相对位置不一样,但编译器对他们的地址分配完全不同,这是为什么呢? 因为编译器会按照他自己的方法顺序地给变量分配空间。
有时候我们见到的情况又不是这样的,那是为什么呢? 因为在上面的定义中,我选择了无优化?而一旦我们选用了优化级别,编译器就会按照优化的类型重新分配。选择时间优化或空间优化都可能影响到变量的空间分配。就相当于我们在定义结构体时选择字对齐还是字节对齐。
说到底,是殊途同归的事,关键是看你有悟性悟出这些道理。
看了这些,你觉得是谁在误认子弟呢? 回到开始,我还是建议你多看点书再下结论。
感谢Triton这么详尽的回复!
网友们有什么见解,也欢迎更深入、更认真地探讨技术问题...