我创建了包含整数和几个方法的简单对象,仅使用整数原始变量并比较它们的大小。 "的sizeof()"对于" 4"的返回值。为什么 - 不应该是复合类型的对象,并且包含有关方法的信息需要更多空间?
#include <iostream>
class Person{
private:
int a;
public:
void hello(){
std::cout << "hello";
}
void DoSomething(){
a++;
}
};
int main(){
int a;
Person p;
std::cout << sizeof(a) << std::endl;
std::cout << sizeof(p) << std::endl;
return 0;
}
答案 0 :(得分:10)
这些方法(技术上是C ++术语中的成员函数)对&#34; size&#34;没有贡献。一个对象。如果你考虑一下,这是有道理的。成员函数适用于从类或其后代实例化的任何对象,并且在某种意义上独立于实例。您可以将某个虚构类Foo
的成员函数视为声明为
return_type some_member_function(Foo* ptr, /* other params */){...}
其中第一个参数是指向要应用函数的实例的指针。编译器实际上在调用成员函数时隐式传递指针ptr
,所以
foo.some_member_function(/* other params */)
正在内部翻译为
some_member_function(&foo, /* other params */)
您可以通过关键字ptr
在实际C ++代码中使用this
指向的当前实例的地址。技术上the keyword this
is a prvalue expression whose value is the address of the object, on which the member function is being called.
PS:正如注释中提到的@greyfade一样,对象的大小可能仅仅通过virtual
成员函数的声明来增加,因为在这种情况下编译器必须在内部存储指向所谓的&#34;虚拟表&#34;。无论虚拟功能是否被覆盖,都是这种情况。因此,如果您关心对象大小,不要盲目地将析构函数设置为虚拟,除非您打算将您的类用作层次结构中的基础。