c++ - 为什么没有 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。没有找到任何其他表明这种行为的文档。如果有人知道或有进一步深入研究的建议,我将不胜感激。
解决方案
推荐阅读
- node.js - 如何通过 PM2 运行“npm start”?
- python - 修改一个json文件
- javascript - If/Else Bootstrap 分页规则仅适用于根 URL(Express JS / Bootstrap)
- php - PHP 假 url 解析成 GET 或类似的
- mysql - 如何将表与自身连接?
- python - 在Python中获取列表组合而不用替换
- python - 为什么 selenium 无法找到 Disqus 评论部分?
- python - 如何在熊猫中动态添加时间桶
- laravel - laravel rest api POST的CORS问题
- sql - SQL Server 通过组合 2 列连接表