带有 #pragma pack(1) 的 struct 数组,还是 struct 字段的数组?[关闭]

array of struct with #pragma pack(1), or arrays of struct's fields? [closed]

提问人:Chameleon 提问时间:11/14/2023 更新时间:11/14/2023 访问量:54

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章用事实和引文来回答。

8天前关闭。

假设我们有一个非常大的稀疏矩阵的稀疏行向量。

稀疏向量的每个元素是:

#pragma pack(1)
struct sparse_element
{
   size_type index;  // probably uint32_t or uint16_t (templated)
   value_type value; // probably double (templated)
};
#pragma pack()

我们在这里看到,如果没有每个稀疏元素,则需要 16 个字节,而不是 12 个甚至 10 个字节。这会影响非常大的矩阵的内存。#pragma pack

稀疏矩阵和稀疏向量的最佳方法是什么?假设对于稀疏向量:

  • 一个数组 like withsparse_elementstd::vector<sparse_element>#pragma pack()
    • 它占用内存,只是用于数据的内容。没有填充字节。
    • (我听说)在某些架构上,对内存的未对齐访问成本太高。
  • 一个分配的内存区域,里面有 2 个阵列,一个用于,一个用于,例如 和。根本没有结构。它被分解。indexvaluestd::span<index_type>std::span<value_type>sparse_element
    • 它占用内存,只是用于数据的内容。没有填充字节。
    • 没有对内存的未对齐访问。
    • 更复杂的实现。

这个问题会影响每个具有大量元素的结构数组。

我赞成第二种方法。

C++ 数组 填充

评论

5赞 Alan Birtles 11/14/2023
定义?您似乎已经列出了每种方法的优点和缺点,您还需要知道什么?best
0赞 Chameleon 11/14/2023
@AlanBirtles在这方面有更多的经验,可能我错过了一些东西。
5赞 BoP 11/14/2023
在某些体系结构上,未对齐的访问可能根本不起作用。
5赞 NathanOliver 11/14/2023
而在其他情况下,它带来了非常大的性能成本。您需要分析节省的空间是否值得增加时间。

答: 暂无答案