Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C++;纯虚函数使类的大小变大_C#_C++_Sizeof_Pure Virtual - Fatal编程技术网

C# C++;纯虚函数使类的大小变大

C# C++;纯虚函数使类的大小变大,c#,c++,sizeof,pure-virtual,C#,C++,Sizeof,Pure Virtual,我的数学库大量使用接口。它的工作方式是我有一个接口,例如IVector,然后子类可以派生/实现它。原因是所有的向量都需要能够将一个点积与另一个向量相乘,我不想因为某种原因而忘记它,所以有它是很好的。 不过,这些并不完全是接口。例如,获取向量大小的实现并不特定于每个向量结构,所以我只是将其放在IVector中。我还有一个从IVector接口调用函数的向量名称空间,因此我还可以使用Vector::Dot(a,b),而不是a.Dot(b) 这种设置工作得非常好,但有一个大问题:实现接口的结构的大小更大

我的数学库大量使用接口。它的工作方式是我有一个接口,例如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();
    }
}