class Test { int x; }; int main() { cout << sizeof(Test) ; return 0; }
输出:4个我只是想问,即使我没有创建任何对象的类测试,为什么它打印4?
nimxete21#
sizeof(X)是X创建时占用的字节数。调用new往往会使用更多的字节来增加内存使用开销,但X[N]的自动存储(栈上或本地或全局或静态等)阵列实际上将占用N*sizeof(X)内存(由于线程安全要求,可能会有一点额外的函数本地静态)。它与类型本身占用的内存量无关。如果类本身有没有优化掉的方法,如果它们有一个vtable(由使用virtual关键字引起的)或类似的东西,那么类本身就会使用内存。然后,存储代码或虚函数表的内存可能存在于类示例的内存开销之外。在 C++ 本身,没有办法确定类本身占用多少内存,也没有可靠的方法确定new的开销是多少。您通常可以通过查看给定平台的运行时行为或编译器或运行时库的代码来解决这个问题。
sizeof(X)
X
new
X[N]
N*sizeof(X)
virtual
8aqjt8rx2#
类或或结构体基本上是一种数据类型(不完全是数据类型),因此数据类型在创建其变量时会占用内存。因此类在创建其对象时会占用空间。如果类有静态成员变量,即使没有示例化,也会占用空间。
2条答案
按热度按时间nimxete21#
sizeof(X)
是X
创建时占用的字节数。调用new
往往会使用更多的字节来增加内存使用开销,但X[N]
的自动存储(栈上或本地或全局或静态等)阵列实际上将占用N*sizeof(X)
内存(由于线程安全要求,可能会有一点额外的函数本地静态)。它与类型本身占用的内存量无关。
如果类本身有没有优化掉的方法,如果它们有一个vtable(由使用
virtual
关键字引起的)或类似的东西,那么类本身就会使用内存。然后,存储代码或虚函数表的内存可能存在于类示例的内存开销之外。在 C++ 本身,没有办法确定类本身占用多少内存,也没有可靠的方法确定
new
的开销是多少。您通常可以通过查看给定平台的运行时行为或编译器或运行时库的代码来解决这个问题。8aqjt8rx2#
类或或结构体基本上是一种数据类型(不完全是数据类型),因此数据类型在创建其变量时会占用内存。因此类在创建其对象时会占用空间。如果类有静态成员变量,即使没有示例化,也会占用空间。