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型或者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,则中间两个字节空间就浪费了

  • 天啊,明显不是这样的啊,不要误人子弟

  • YI ZHAO,

    这是C语言和编译原理的基础知识,如果你觉得不对,请你指出不对的地方。如果你不清楚,请回去学习下基础知识。

  • 补充实例说明如下:

    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的解释非常详细,受教了!

  • 感谢Triton这么详尽的回复!

    网友们有什么见解,也欢迎更深入、更认真地探讨技术问题...

  • 上传一份我给内部员工培训的资料,大家一起学习一下

    C语言对齐.pdf