虚拟方法内存使用java vs C++ 警告:请记住这个问题是错误的——它错误地假设了,因为我误解了一本写得很差的教程,实际上是C++上的一本书。出于好奇,以下是原始内容: 在C++中标记一个方法,使对象使用更多 内存-对于每个额外的虚拟方法,指针的内存 4-8字节更多。Java如何处理这个问题,所有方法 默认情况下是虚拟的吗

虚拟方法内存使用java vs C++ 警告:请记住这个问题是错误的——它错误地假设了,因为我误解了一本写得很差的教程,实际上是C++上的一本书。出于好奇,以下是原始内容: 在C++中标记一个方法,使对象使用更多 内存-对于每个额外的虚拟方法,指针的内存 4-8字节更多。Java如何处理这个问题,所有方法 默认情况下是虚拟的吗,java,c++,memory,virtual,Java,C++,Memory,Virtual,您确定对象正在使用更多内存吗?我想说的是,虚拟函数表使用了更多的空间,而不是每个对象。您的基本假设是错误的。对象的大小不会随着虚拟函数的数量而增加 如果类有任何虚拟函数,那么它有一个指向该类的vtable的指针。无论有多少虚拟函数,对象的大小都不会超过该值: struct s0 {}; struct s1 { virtual void f1() {} }; struct s2 { virtual void f1() {} virtual void f2() {} };

您确定对象正在使用更多内存吗?我想说的是,虚拟函数表使用了更多的空间,而不是每个对象。

您的基本假设是错误的。对象的大小不会随着虚拟函数的数量而增加

如果类有任何虚拟函数,那么它有一个指向该类的vtable的指针。无论有多少虚拟函数,对象的大小都不会超过该值:

struct s0 {};

struct s1
{
    virtual void f1() {}
};

struct s2
{
    virtual void f1() {}
    virtual void f2() {}
};

struct s3
{
    virtual void f1() {}
    virtual void f2() {}
    virtual void f3() {}
};

int main()
{
    std::cout << "s0: " << sizeof(s0) << '\n';
    std::cout << "s1: " << sizeof(s1) << '\n';
    std::cout << "s2: " << sizeof(s2) << '\n';
    std::cout << "s3: " << sizeof(s3) << '\n';
}

这是一个简单的问题,但似乎没有人愿意去评论它到底出了什么问题。我希望这不是对Java的仇恨。你的假设是错误的。C++有一个不为类的虚拟方法的表。首先,你可以给我一个参考,在这里写下,对于每一个附加的虚拟方法,指针的内存都是4到8字节。这是我正在读的一本书。你在说哪本书?我读的书不清楚。我做了同样的事情。
s0: 1
s1: 8
s2: 8
s3: 8