sizeof问题
函数参数传递数组的退化问题
注意sizeof是一个运算符,而不是一个函数。所以一般情况下数组传递给函数,都是要退化成指针的。所以下面这个
void fun(char str_arg[100])
{
printf("%d\n", sizeof(str_arg));
}
输出4(32位)或者8(64位);作为函数参数传递,以下写法均等价:
fun(char [8])
fun(char [])
fun(char *)
###sizeof和strlen的区别###
char a[] = "1234";
char b[10] = "12345";
cout << sizeof(a) << " " << strlen(a) << endl;
//输出5 4
cout << sizeof(b) << " " << strlen(b) << endl;
//输出10 5
因为strlen只能传入char* ,它是从头开始找直到找到’\0’为止,其只返回数组自己的长度,而sizeof计算的是开辟这块内存空间的大小。
类对象的sizeof大小
有两个需要注意的地方,一个是虚函数的虚函数表占4字节,还有一个是对其问题对齐问题,在我的另外一个文章中已经说过了C++11中枚举enum和union,顺带说一下内存对齐和大小端问题
还有个小细节
柔性数组
struct A{
};
cout<<sizeof(A); //输出1,虽然类里面没有任何东西,但是它还是会占个地方(?)这个地方解释存疑
struct B{
int t;
int a[0];
};
cout<<sizeof(B); //输出4
长度为0的数组,这样只能在结构体/类中定义,如果再函数中定义会报错,其不占内存空间。这种数组叫柔性数组
结构体最后使用0或1的长度数组的原因,主要是为了方便的管理内存缓冲区,如果你直接使用指针而不使用数组,那么,你在分配内存缓冲区时,就必须分配结构体一次,然后再分配结构体内的指针一次,(而此时分配的内存已经与结构体的内存不连续了,所以要分别管理即申请和释放)而如果使用数组,那么只需要一次就可以全部分配出来,(见下面的例子),反过来,释放时也是一样,使用数组,一次释放,使用指针,得先释放结构体内的指针,再释放结构体。还不能颠倒次序。
其实就是分配一段连续的的内存,减少内存的碎片化。