如何解决为什么这个 C++ 结构被填充?
我有两个数据结构,我通过这个函数来检查它们是否(可能)被填充。
template<typename T>
constexpr bool has_padding() noexcept
{
return !std::is_standard_layout<T>() || alignof(T) != 1;
}
这个数据结构通过没有问题:
struct txin_to_key
{
uint64_t amount;
std::vector<uint64_t> key_offsets;
crypto::key_image k_image; // double spending protection
};
但是这个结构失败了:
struct txin_to_key_public
{
crypto::hash tx_hash;
uint64_t amount;
uint32_t relative_offset;
};
Key_image 和 hash 都是底层的 char[32]。当我将第二个结构包装在 pragma pack (1) 中时,我很好。第二种结构的香草版本有什么问题?
解决方法
第二个结构的原版有什么问题?
没有“问题”。
如果您的意思是,为什么 has_padding<txin_to_key_public>
为真,那是因为 uint32_t
和/或 uint64_t
的对齐要求在您的系统上大于 1。
那么为什么第一个 txin_to_key ... [has_padding 返回 true]
因为 std::vector<uint64_t>
不是标准的布局类。也可能是因为对齐方式,就像第二种情况一样。
您可以通过单独检查 condition1 || condition2
的哪些条件来验证它们。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。