sizeof是算对象大小?还是对象长度?最字符串时strlen和它有什么不同?
在CSDN中看到,对类用sizeof得到的大小不是每个成员变量大小之和,还要考虑4字节对齐问题?怎么让系统不考虑4字节对齐问题呢?

解决方案 »

  1.   

    1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。 
    2.sizeof是算符,strlen是函数。 
    3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。sizeof还可以用函数做参数,比如: 
    short f();
    printf("%d\n", sizeof(f()));输出的结果是sizeof(short),即2。 
    4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。 
    5.大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因 
    char str[20]="0123456789";
    int a=strlen(str); //a=10;
    int b=sizeof(str); //而b=20;6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。 
    7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。 
    8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小, 当适用一静态地空间数组, sizeof 归还全部数组的尺 寸。 sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸 
    9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如: 
    fun(char [8])
    fun(char [])都等价于 fun(char *) 在C++里传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小如果想在函数内知道数组的大小, 需要这样做:进入函数后用memcpy拷贝出来,长度由另一个形参传进去 
    fun(unsiged char *p1, int len)
    {
      unsigned char* buf = new unsigned char[len+1]
      memcpy(buf, p1, len);
    }
    10.计算结构变量的大小就必须讨论数据对齐问题。为了CPU存取的速度最快(这同CPU取数操作有关,详细的介绍可以参考一些计算机原理方面的书),C++在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(data alignment)。这样做可能会浪费一些内存,但理论上速度快了。当然这样的设置会在读写一些别的应用程序生成的数据文件或交换数据时带来不便。MS VC++中的对齐设定,有时候sizeof得到的与实际不等。一般在VC++中加上#pragma pack(n)的设定即可.或者如果要按字节存储,而不进行数据对齐,可以在Options对话框中修改Advanced compiler页中的Data alignment为按字节对齐。 
    11.sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式 
      

  2.   

    sizeof 是查询 对象所占空间的大小。strlen()是C语言风格字符串的运算方法,它默认以'\0'结束的字符串来认定为字符串的末尾情况一:
    char buf[200];
    buf[0] = 'a';
    buf[1] = 'b';
    buf[2] = 'c';
    buf[3] = '\0';这时候,sizeof计算其空间大小的话,就应该是200个字节。这时候buf用strlen计算的话,就是3个字节。其长度不包含'\0';情况二:
    char *p = "abc";这时候,sizeof计算的是指针的占用空间大小,默认是2个字节,32位系统中指针占4个字节。这时候,用strlen计算的话,是3个字节,它计算字符串的长度
    结构体大小的运算
    结构体的大小
    struct s
    {
    int a;
    short b;
    };结果是8,这就是由于发生了对齐。解决内存对齐的办法很简单在头文件上部加这么一句
    #parma pack(1)