1.指针的大小永远是固定的,取决于处理器位数,32位就是 4 字节,64位就是 8 字节
2.数组作为函数参数时会退化为指针,大小要按指针的计算
int func(char array[]) {
printf("sizeof=%d\n", sizeof(array));
printf("strlen=%d\n", strlen(array));
}
int main() {
char array[] = "Hello World";
printf("sizeof=%d\n", sizeof(array));
printf("strlen=%d\n", strlen(array));
func(array);
}
输出的是
//字符串数组要算上末尾的 '\0'
sizeof=12
strlen=11
//退化为指针
sizeof=8
strlen=11
3.结构体会自动对齐
#include<iostream>
#include<string>
struct AlignedStruct {
char a; // 本来1字节,padding 3 字节
int b; // 4 字节
short c; // 本来 short 2字节,但是整体需要按照 4 字节对齐(成员对齐边界最大的是int 4) ,
//所以需要padding 2,总共: 4 + 4 + 4
};
int main(void)
{
printf("%d\n",sizeof(AlignedStruct));
system("pause");
return 0;
}
输出的是
结构体内部的每个成员都根据其自然对齐边界进行对齐。
也就是可能在成员之间插入填充字节。
结构体本身的总大小也会根据其最大对齐边界的成员进行对齐
(比如结构体成员包含的最长类型为int类型,那么整个结构体要按照4的倍数对齐),以便在数组中正确对齐。
//由于padding size=4+4+4=12
12
3.空结构体的size为1
1的理由:在 C++ 中,当你定义一个空结构体(即不包含任何成员变量的结构体)时,sizeof(EmptyStruct) 返回 1。这是因为 C++ 标准要求每个不同的对象必须占用不同的地址,即使是空结构体。因此,编译器会为空结构体分配一个字节的内存,以确保每个实例都有一个唯一的地址。