zoukankan      html  css  js  c++  java
  • 内存对齐 和 sizeof小结

    数据对齐(内存对齐)指该数据所在的地址必须是该数据长度的整数倍。X86CPU能直接访问对齐的数据,当它试图访问未对齐的数据时,会在内部进行一系列的调整,降低运行速度。数据对齐一般出现在结构体和类中,在默认情况下,为了方便对结构体内元素的访问和管理,当结构体内的元素的长度都小于处理器的位数的时候,便以结构体里面最长的数据元素为对齐单位,也就是说,结构体的长度一定是最长的数据元素的整数倍。如果结构体内存在长度大于处理器位数的元素,那么就以处理器的位数为对齐单位。但是结构体内类型相同的连续元素将在连续的空间内,和数组一样(摘录)。

    sizeof是C/C++中的一个操作符(不是函数!),其作用是返回对象或类型的所占内存字节数,类型为size_t (该返回值依赖于编译系统,但sizeof(char) == 1 ,此值是确定的)。

    一般用法为  sizeof(类型说明符) 或  sizeof(变量名) 。sizeof的计算发生在编译时,所以可以这样用: int array[sizeof(int) * 6] ;

    下面以例程详细说明:

    注:我的电脑是32位XP系统,使用vs2008编译,sizeof(short) == 2  , sizeof(int) == 4;

    1 typedef struct{
    2         char  a;
    3         short b;
    4         int   c;
    5         char  d;
    6     }ST_TEST;

    上面定义了ST_TEST类型的结构体,其中最长的元素为int类型,所以会以4字节对齐。输出sizeof(ST_TEST)值为12,对齐方式如下:

    类中的对齐和结构类似,但是注意:类中如果有静态成员变量,因为静态变量是存放在全局数据区的,而sizeof计算栈中分配的大小,所以是不会将静态变量计算在内的。

    对齐这块就说这个多吧,大家可以自己在编译器上多写几个结构试试就会更理解了。

    下面再说sizeof的其他使用,依旧看例码:

    1 char sch_0[100] = "0123456789";
    2 char sch_1[] = "0123456789";
    3 char sch_2[] = "abc\n";
    4 int  iarr[100] = {0};
    5 
    6 char *pch_0 = "0123456789";
    7 char *pch_1 = "abc\n";
    8 int  *parr = &iarr[10];

    对以上变量使用sizeof,输出依次为 100、11、5、400、4、4、4.

    第一行 sch_0 数组,其大小相当于 sizeof(char)*100 ;

    第二行 sch_1 数组,未显式指定大小,所以其大小根据字符串内容计算,为“0-9” 10个字符,加上末尾的 '\0' 结束字符,共11个;

    第三行 sch_2 数组,同第二行,但是 '\n' 为1个字符(转义字符);

    第四行 iarr 数组,大小为 sizeof(int)*100 ;

    最后三行的输出都为4,这是因为例如 sizeof(pch_0) 求的是一个指针的大小,换句话说就是求一个地址占多少字节,我们假如pch_o的值为0xFF66AACC,4字节指的就是这个地址值本身,跟这个地址指向什么数据(类型)无关!

    再附加一个 strlen :这是一个函数! 获得一个字符串的长度,不包括结尾的空字符(NULL)。 如strlen(sch_0) == 10 ,strlen(pch_1) == 4 ;

    strlen只能用于char类型的字符串(数组),若strlen(iaar) ,则会报错。

    .

    空类所占空间为1,单继承和多继承空类的空间仍为1,虚继承的空类为4.(看到了顺便)

     .

    .

    .

    补充一个很简单却有一定迷惑性的例题:

    1 char var[10] = {0};
    2 int test(char var[])
    3 {
    4     return sizeof(var);
    5 }

    问以上函数输出结果?注意:正确答案是4.因为形参将退化为指针,返回结果就是一个指针的内存大小。它的迷惑性就在于test函数的形参刚好和第一行定义的数组同名,不要被他骗了.....

  • 相关阅读:
    eclipse lua
    eclipse新建python项Project interpreter not specified
    Laravel Debugbar
    Java中枚举类型简单学习
    SG函数题目
    关于解决博弈论问题的SG函数
    三种典型的博弈论问题
    Java I/O 对象序列化
    Java I/O 文件加锁,压缩
    Java I/O NIO学习
  • 原文地址:https://www.cnblogs.com/gklovexixi/p/5772125.html
Copyright © 2011-2022 走看看