首页 > 解决方案 > 为什么没有 vtable 的结构有额外的 4 个字节?

问题描述

我有一个类层次结构,它使用 CRTP 跨模板专业化进行“继承”。这个类代表一个数学矩阵。当我实例化这个具体类时,sizeof(Matrix<int, 4, 4>)返回的字节比我预期的多 4 个字节。通常我会将额外的内存归因于某个地方的 vtable,但在这种情况下,我希望它是 8 个字节(指针),而且我只希望我有任何虚拟函数,但我没有。最重要的是,当我打印出std::is_polymorphic<Matrix<float, 4, 4>>::value结果是错误的。这可能不是对齐打包问题,因为这应该是一个完美的 2^6。我要么遗漏了有关 c++ 标准的一些关键信息,要么 win32 c++ 编译器正在做一些可疑的事情。

层次结构看起来像这样,(为了简洁省略非属性):

template<class T, uint32_t length, class CRTP>
struct BaseDimensional {
    // only functions, no virtuals
}

template<class T, uint32_t length, class CRTP>
struct IntegralNumberDimensional {
    // only functions, no virtuals
};

template<class T, uint32_t row, uint32_t col, class CRTP>
class BaseMatrix : public BaseDimensional<T, row * col, CRTP> {
protected:
    union {
        T mat[col][row]{};
        T arr[col * row];
    };
public:
    // functions, no virtuals
}

template<class T, uint32_t row, uint32_t col>
struct Matrix : public BaseMatrix<T, row, col, Matrix<T, row, col>>,
        public IntegralNumberDimensional<T, row * col, Matrix<T, row, col>> {
    // empty
}

我正在使用 Visual Studio 2019 中内置的编译器,/SUBSYSTEM:windows /ENTRY:mainCRTStartup /std:c++17 /EHsc /MDd /Zi如果这很重要,则带有标志。当打印出对象中的所有字节时,额外的字节出现在开头。调试时,显示的唯一值是联合。sizeof(Matrix<int, 4, 4>)出来 68。没有找到任何其他表明这种行为的文档。如果有人知道或有进一步深入研究的建议,我将不胜感激。

标签: c++visual-c++visual-studio-2019

解决方案


推荐阅读