内容参考于《21天学通C++》(第八版)
不去纠结C++的原理和细节,从C的角度去学习C++,再通过C++项目去加深理解
四.sizeof用于类
1. 示例-只算成员变量大小,不算方法
#include <iostream>
#include <string.h>
using namespace std;
class MyString
{
private:
char* buffer;
public:
MyString(const char* initString) // default constructor
{
buffer = NULL;
if (initString != NULL)
{
buffer = new char[strlen(initString) + 1];
strcpy(buffer, initString);
}
}
MyString(const MyString& copySource) // copy constructor
{
buffer = NULL;
if (copySource.buffer != NULL)
{
buffer = new char[strlen(copySource.buffer) + 1];
strcpy(buffer, copySource.buffer);
}
}
~MyString()
{
delete[] buffer;
}
int GetLength()
{
return strlen(buffer);
}
const char* GetString()
{
return buffer;
}
};
class Human
{
private:
int age;
bool gender;
MyString name;
public:
Human(const MyString& InputName, int InputAge, bool gender)
: name(InputName), age(InputAge), gender(gender) {}
int GetAge()
{
return age;
}
};
int main()
{
MyString mansName("Adam");
MyString womansName("Eve");
cout << "sizeof(MyString) = " << sizeof(MyString) << endl;
cout << "sizeof(mansName) = " << sizeof(mansName) << endl;
cout << "sizeof(womansName) = " << sizeof(womansName) << endl;
Human firstMan(mansName, 25, true);
Human firstWoman(womansName, 18, false);
cout << "sizeof(Human) = " << sizeof(Human) << endl;
cout << "sizeof(firstMan) = " << sizeof(firstMan) << endl;
cout << "sizeof(firstWoman) = " << sizeof(firstWoman) << endl;
return 0;
}
32位编译器输出
sizeof(MyString) = 4
sizeof(mansName) = 4
sizeof(womansName) = 4
sizeof(Human) = 12
sizeof(firstMan) = 12
sizeof(firstWoman) = 12
64未编译器输出
sizeof(MyString) = 8
sizeof(mansName) = 8
sizeof(womansName) = 8
sizeof(Human) = 16
sizeof(firstMan) = 16
sizeof(firstWoman) = 16
从中可知,将 sizeof( )用于类及其对象时,结果相同。 sizeof(MyString)和sizeof(mansName)的值相同,因为类占用的字节数在编译阶段就已确定。虽然 mansName 包含 Adam,而 womanName 包含 Eve,但它们占用的字节数相同,这没什么可奇怪的,因为存储姓名的MyString::buffer 是一个 char *,这是一个大小固定的指针(在我使用的 32 位系统中,为 4 字节),而与指向的数据量无关。将 sizeof( )用于 Human 时,结果为 12。第 44~46 行表明, Human 包含一个 int 成员、一个 bool成员和一个 MyString 成员。要获悉内置类型占用的字节数,请参阅程序清单 3.4。从该程序清单可知,int 占用 4 字节, bool 占用 1 字节,而 MyString 占用 4 字节。它们的总和与输出中的 12 字节不符,这是因为 sizeof( )的结果受字填充( word padding)和其他因素的影响。