什么决定了这里的对象大小?
What determines object size here?
我创建了包含整数和少数方法的简单对象,单独的整数原始变量并比较了它们的大小。 "sizeof()" 两个返回值“4”。为什么 - 复合类型的对象不应该包含有关方法的信息需要更多 space?
#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++ 术语中的成员函数 )对对象的 "size" 没有贡献。如果你考虑一下,这是有道理的。成员函数适用于从 class 或其后代实例化的任何 对象,并且在某种意义上独立于实例。您可以将某些虚构的 class 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
成员函数就可以增加对象的大小,因为在这种情况下,编译器必须在内部存储指向所谓的 "virtual table" 的指针。无论虚函数是否被覆盖都是如此。因此,如果您关心对象大小,请不要盲目地将析构函数设为虚拟,除非您打算使用 class 作为层次结构中的基础。
我创建了包含整数和少数方法的简单对象,单独的整数原始变量并比较了它们的大小。 "sizeof()" 两个返回值“4”。为什么 - 复合类型的对象不应该包含有关方法的信息需要更多 space?
#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++ 术语中的成员函数 )对对象的 "size" 没有贡献。如果你考虑一下,这是有道理的。成员函数适用于从 class 或其后代实例化的任何 对象,并且在某种意义上独立于实例。您可以将某些虚构的 class 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
成员函数就可以增加对象的大小,因为在这种情况下,编译器必须在内部存储指向所谓的 "virtual table" 的指针。无论虚函数是否被覆盖都是如此。因此,如果您关心对象大小,请不要盲目地将析构函数设为虚拟,除非您打算使用 class 作为层次结构中的基础。