sizeof用来计算变量在所占内存的大小,以字节为单位
C++整型数据长度标准:
short 至少16位
int 至少与 short 一样长
long 至少32位,且至少与 int 一样长
long long 至少64为,且至少与 long 一样长
很多系统都使用最小长度,short 为16位即2个字节,long为32位即4个字节,long long位64位即8个字节,int 的长度较为灵活,一般认为 int 的长度为4个字节,与 long 等长.
sizeof计算大小的小技巧
- 指针的大小永远是固定的,取决于处理器位数,32位就是4字节,64位就是8字节。
- 数组作为函数参数时会退化为指针,大小要按指针的计算。
- struct 结构体要考虑字节对齐。
- 字符串数组要算上末尾的 '\0' 。
// 前提: 64 位电脑上
#include <iostream>
using namespace std;
char str[] = "1234567890" ;
char *p = str;
double dp;
float f = 0.1;
int n = 10;
void *vp = malloc( 100 );
struct AlignedStruct {
char a; // 本来1字节,padding 3 字节
int b; // 4 字节
short c; // 本来 short 2字节,但是整体需要按照 4 字节对齐(成员对齐边界最大的是int 4) ,
//所以需要padding 2,总共: 4 + 4 + 4
};
struct EmptyStruct {};
int Func (char str[10])
{
cout << sizeof( str )<< endl;
return sizeof( str ); // 数组做参数退化为 char类型指针,即 8 个字节,总结第2点
}
int main()
{
cout << "str = " << sizeof(str) << endl;
cout << "p = " << sizeof(p) << endl;
cout << "dp = " << sizeof(dp) << endl;
cout << "f = " << sizeof(f) << endl;
cout << "n = " << sizeof(n) << endl;
cout << "vp = " << sizeof(vp) << endl;
int func = Func(str);
cout << "Func(str) = " << func << endl;
cout << "AlignedStruct = " << sizeof(AlignedStruct) << endl;
cout << "EmptyStruct = " << sizeof(EmptyStruct) << endl;
return 0;
}
运行结果:
strlen与sizeof的区别
strlen 是一个 C 标准库中的函数,用于计算 C 风格字符串(以空字符 '\0' 结尾的字符数组)的长度,即不包括结尾的空字符的字符个数。它的源码如下:
size_t strlen(const char *str) {
size_t length = 0;
while (*str++)
++length;
return length;
}
而sizeof 是一个 C++ 编译期间计算的操作符,用于计算数据类型或对象所占用的字节数。