我创建了包含整数和少数方法的简单对象,单独的整数原始变量并比较了它们的大小。 “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;
}
最佳答案
方法(C++ 术语中的技术成员函数)不会影响对象的“大小”。如果你考虑一下,这是有道理的。成员函数适用于从类或其后代实例化的任何对象,并且在某种意义上独立于实例。您可以将某些虚构类 Foo
的成员函数视为声明为
return_type some_member_function(Foo* ptr, /* other params */){...}
其中第一个参数是指向您正在应用该函数的实例的指针。编译器实际上在调用成员函数时隐式传递了指针ptr
,所以
foo.some_member_function(/* other params */)
内部翻译为
some_member_function(&foo, /* other params */)
您可以通过关键字this
在实际的C++代码中使用ptr
指向的当前实例的地址。技术上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
成员函数的简单声明来增加,因为在这种情况下,编译器必须在内部存储一个指向所谓的“虚拟表”的指针。无论虚函数是否被覆盖都是如此。因此,如果您关心对象大小,请不要盲目地将析构函数设为虚拟,除非您打算将您的类用作层次结构中的基类。
关于c++ - 什么决定了这里的对象大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28844975/