包含载体的构造矢量的字节中的大小,C
size in bytes of a vector of structs containing vector, C++
i具有一个数据结构,该数据结构是结构的std::vector
,其中每个结构还包含std::vector
。我想预先计算代表整个结构所需的内存的上限。为此,在测试中,我想计算最终结构的内存要求,并将其与我的估计进行比较。
为此,我使用以下代码:
struct SequenceInfo {
unsigned long num1;
unsigned long num2;
unsigned long vectorLength;
std::vector<unsigned long> values;
};
// A vector of sequence data to represent all data
typedef std::vector<SequenceInfo> SequenceInfoVec;
void foo(SequenceInfoVec& vec)
{
getVec(vec);
std::size_t actualSize = sizeof(SequenceInfoVec);
for (SequenceInfoVec::iterator it1 = vec.begin(); it1 != vec.end(); ++it1)
{
actualSize += sizeof(SequenceInfo) +
sizeof((*it1).values[0]) * (*it1).values.size();
}
cout << "memory size of vec is: " << actualSize << endl;
}
这是计算数据结构内存要求的正确方法(无视小型OS开销以进行内存分配)?
是的,这是正确的。但是我认为,最好避免明确提及类型(您已经在一定程度上做到了),并用标准库中的命名算法替换原始循环。
对于C 14您有std::accumulate
:
void foo(SequenceInfoVec& vec)
{
getVec(vec);
auto actualSize = std::accumulate(begin(vec), end(vec), sizeof(vec),
[](auto prev, auto const& item) {
return prev +
sizeof (item) +
sizeof(item.values[0]) * item.values.size();
}
);
cout << "memory size of vec is: " << actualSize << endl;
}
,由于您并不真正关心计算顺序,对于C 17,您甚至可以与std::reduce
并行化计算:
void foo(SequenceInfoVec& vec)
{
getVec(vec);
auto actualSize = std::reduce(std::execution::par, begin(vec), end(vec), sizeof(vec),
[](auto prev, auto const& item) {
return prev +
sizeof (item) +
sizeof(item.values[0]) * item.values.size();
}
);
cout << "memory size of vec is: " << actualSize << endl;
}
相关文章:
- 如何制作一个只包含字符的简单加载屏幕
- 我该如何循环遍历我的数组(缓冲区——包含一个文本文件),并将其打印成30字节的块
- 加载字节数组(从内存)到libpng c
- C 链接器错误尝试包含Tiny OBJ加载程序标头文件
- 从字节数组加载 QImage,而无需知道格式
- 在 qml 中从字节数组加载到图像
- 如何将包含中文或韩语的字符串转换为十六进制/字节
- 一个在不同字节中包含int的类
- 包含消息长度的两个字节标头上的部分recv()呢?
- 从字节加载天然DLL []
- 包含载体的构造矢量的字节中的大小,C
- 在仅包含字节而不是指令名称的函数中使用 ASM
- 如何使用OpenCV加载图像(原始字节)
- 我将如何从字符串/字节数组或任何其他容器加载私钥/公钥
- 将包含十六进制值的字符串转换为c中的char字节
- new[] 一个包含构造函数的字节对象数组没有错,对吧?
- setw() 在包含 UTF-8 多字节字符/码位的字符串上输入错误的输出
- 从字符串加载字节数组无法正常工作?
- 如何在__m128i的特定位置加载字节
- 从c++中的字节加载提升::uuid