#sizeof及其用法

###1. sizeof在msdn上的定义如下:

The sizeof keyword gives the amount of storage, in bytes, associted with a variable or a type (including aggregate types). This keyword returns a value of type size_t.

sizeof 不是函数, 而是 C 语言数据类型关键字.

###2. sizeof 用法如下:

  • sizeof(object)
  • sizeof(typename)

可以对对象使用 sizeof, 也可以对类型使用. sizeof i OR sizeof(int).

通过sizeof i 更能看出, sizeof 不是函数. 不过, 在使用的时候, 最好都加上括号. 看看在64位机子上, 各个数据类型的大小:

cout << sizeof(int) << endl;            //4
cout << sizeof(unsigned int) << endl;   //4
cout << sizeof(unsigned) << endl;       //4
cout << sizeof(short int) << endl;      //2
cout << sizeof(char) << endl;           //1
cout << sizeof(string *) << endl;       //8
cout << sizeof(void *) << endl;         //8 
cout << sizeof(char *) << endl;         //8
cout << sizeof(int *) << endl;          //8

可以看出, 指针的不管类型, 都是8, 32位机一般都是4.

###3. 数组大小问题 看看下面的函数

char a[] = "abcdefg";
int b[13] = {
    1, 2
};
char c[2][8] = {
    "aa", "bb"
};
cout << sizeof(a) << endl;  //8
cout << sizeof(b) << endl;  //52
cout << sizeof(c) << endl;  //16

记住, 数组的大小就是在被编译是给的空间 ###4. 注意 sizeof 对象是数组和指针的区别 当 sizeof 对象是数组时, 返回的是数组的大小, 对象是指针时, 返回的是指针的大小. 注意, 当数组名作为实参传入函数时, 会自动转换为指针类型, 如下:

void foo(int a[]){
    cout << sizeof(a) << endl;
}
int main()
{
    int a[] = {1, 2, 3, 4, 5};
    int *p = a;
    cout << sizeof(a) << endl;  //20
    cout << sizeof(p) << endl;  //8
    foo(a);                     //8
    return 0;
}

strlen 和 sizeof 比较

这个问题, 在面试上经常碰到. strlen 是从开始到出现’\0’为止, 中间字符的个数, 是在运行阶段执行的, 而 sizeof 是得到数据的大小, 和 strlen 相比, 是得到字符串的容量.如下:

char a[] = "abcdef";
char b[22] = "abcdef";
string s = "abcdefg";

cout << strlen(a) << endl;  //6
cout << strlen(b) << endl;  //6
cout << strlen(s) << endl;  //error

cout << sizeof(a) << endl;  //7
cout << sizeof(b) << endl;  //22
cout << sizeof(s) << endl;  //8

还有, strlen 是一个函数, 得有括号. 在 C++ 中, string 是一个类, 上面函数中的 s 就是一个对象, 因此, sizeof(s) 表示的是类 string 的大小.

strlen(s) 是错误的, 因为 strlen 的参数是一个字符指针, 如果想得到字符串的长度, 应该使用 sizeof(s.c_str()), string 的成员函数c_str() 返回的是字符串的首地址.

struct 的结构对其问题

字节对其也称为字节填充, 他是 C++ 编辑器的一种技术手段, 主要是为了在空间与复杂度上达到平衡. 一般而言, struct 的 sizeof 是所有成员对齐后长度相加, 而 union 的 sizeof 是取最大的成员长度 . 看下面两个例子:

struct test{
    char x1;
    short x2;
    float x3;
    char x4;
};
cout << sizeof(test) << endl;   //12

strcut test2{
    short d;
    int a;
    short b;
};
cout << sizeof(test2) << endl;  //12 

我的理解是, 上面的成员按 4 对齐, 1 + 2( 补齐 ) + 4 + 1( 补齐 ) = 12, 2( 补齐 ) + 4 + 2( 补齐 ) = 12; 如果最大成员为 8, 则按 8 补齐.

#END



blog comments powered by Disqus

Published

24 February 2014

Tags