C# C++;纯虚函数使类的大小变大
我的数学库大量使用接口。它的工作方式是我有一个接口,例如IVector,然后子类可以派生/实现它。原因是所有的向量都需要能够将一个点积与另一个向量相乘,我不想因为某种原因而忘记它,所以有它是很好的。 不过,这些并不完全是接口。例如,获取向量大小的实现并不特定于每个向量结构,所以我只是将其放在IVector中。我还有一个从IVector接口调用函数的向量名称空间,因此我还可以使用Vector::Dot(a,b),而不是a.Dot(b) 这种设置工作得非常好,但有一个大问题:实现接口的结构的大小更大。在做了一些测试之后,我发现原因是纯虚拟函数:C# C++;纯虚函数使类的大小变大,c#,c++,sizeof,pure-virtual,C#,C++,Sizeof,Pure Virtual,我的数学库大量使用接口。它的工作方式是我有一个接口,例如IVector,然后子类可以派生/实现它。原因是所有的向量都需要能够将一个点积与另一个向量相乘,我不想因为某种原因而忘记它,所以有它是很好的。 不过,这些并不完全是接口。例如,获取向量大小的实现并不特定于每个向量结构,所以我只是将其放在IVector中。我还有一个从IVector接口调用函数的向量名称空间,因此我还可以使用Vector::Dot(a,b),而不是a.Dot(b) 这种设置工作得非常好,但有一个大问题:实现接口的结构的大小更大
#include <iostream>
using namespace std;
#define PRINT(thing) cout << thing << endl
struct A
{
virtual void F() = 0;
};
class B final : public A
{
};
class C
{
void F()
{
}
};
class D : public C
{
};
void main()
{
PRINT(sizeof(A)); // 4
PRINT(sizeof(B)); // 4
PRINT(sizeof(C)); // 1
PRINT(sizeof(D)); // 1
cin.get();
}
#包括
使用名称空间std;
#define PRINT(thing)coutC#类的封送处理大小描述了存储它所需的字节数。这与接口无关
< C++类的大小描述了实现它所需的内存量。
这是2个不同的概念,解释你观察到的差异
为什么你对C++和C语言中对象的行为有什么不同感到惊讶?它们是完全不同的语言,具有不同的规范和实现。在C++中,结构的大小一般取决于编译器如何实现的细节。根据C++标准,它是定义的,因此不同编译器可以并且实际上会给出不同的结果。您声称不同的大小会导致“太多的问题”-唯一可能发生的方式是如果您编写的代码依赖于(或假设)具有特定大小的对象。而且,除了在一些非常特殊的情况下,这是程序设计糟糕的标志。“我的数学库大量使用接口。”也许这就是你必须解决的问题。虚拟人占据空间不是一个“问题”,而是一个事实。当你编写C++#define PRINT(东西)时,不要受到C#(或java?)的启发,甚至尝试采用C#接口的大小也是有意义的——它是实现它的类或结构必须具有的方法/属性等的定义。您无法创建接口的实例,因此它的大小没有意义。你说尺寸问题给你带来了问题——到底是什么问题。
using System;
using DotNetCross.Memory;
interface IStuff
{
void DoStuff();
}
interface IPlsStop : IStuff
{
void Whatevah();
}
struct Stuff : IPlsStop
{
public void DoStuff()
{
}
public void Whatevah()
{
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Unsafe.SizeOf<Stuff>()); // 1
Console.WriteLine(Unsafe.SizeOf<IStuff>()); // 8
Console.WriteLine(Unsafe.SizeOf<IPlsStop>()); // 8
Console.ReadKey();
}
}