1、sizeof
基本上笔试都会考到。
sizeof 操作符的作用是返回一个对象或类型名的字节长度。有以下三种形式:
sizeof(type name);
sizeof(object);
sizeof object;
返回值类型是size_t,这是一种与机器相关的typedef 定义,我们可以在cstddef 头文件中找到它的定义。
当sizeof 操作符作用在数组上时,返回整个数组的字节长度,而不是第一个元素的长度,也不是数组包含的元素个数。例如:
int ia[] = {0, 1, 3};
size_t array_size = sizeof ia; // 3 * 4 = 12
int *pi = new int[3];
size_t pointer_size = sizeof(pi); //返回的是指向int型的指针的字节长度:4
应用在指针类型上的sizeof 操作符返回的是包含该类型地址所需的内存长度,而应用在引用类型上的sizeof 操作符返回的是包含被引用对象所需的内存长度, 如:
sizeof(short *);//4
sizeof(short &);//2
一个string的大小与它所指的字符串的长度无关
string str("This is a string");
sizeof(str);//在我的机器上为4
用在字符串数组时:
char ca[] = "This is a char array";
sizeof ca;//21,需要加上最后一个'/0'
在函数中:
func(char *P) {
sizeof(p);//4
}
func(char[] ca) {
sizeof(ca);//4
}
都为指针的长度。
当用sizeof 计算struct的字节长度时,要考虑字节对齐,如:
struct node {
int i;
char c;
int j;
short s;
}
sizeof(node);//16,
一般地,可以通过下面的方法来改变缺省的对齐条件:
使用伪指令#pragma pack (n),编译器将按照n个字节对齐;
使用伪指令#pragma pack (),取消自定义字节对齐方式。
注意:如果#pragma pack (n)中指定的n大于结构体中最大成员的size,则其不起作用,结构体仍然按照size最大的成员进行对齐。
sizeof 可以对函数调用求值,返回函数返回值类型的字节长度,函数不会被调用,但不能对函数,不确定类型的表达式以及位域(bit-field) 成员求值。
sizeof(func);// error
void func1() {}
sizeof(foo2());// error
struct S
{
unsigned int f1 : 1;
unsigned int f2 : 5;
unsigned int f3 : 12;
};
sizeof( S.f1 );// error