gpt4 book ai didi

c++ - 包含 vector 的结构 vector 的字节大小,C++

转载 作者:搜寻专家 更新时间:2023-10-31 02:09:54 25 4
gpt4 key购买 nike

我有一个数据结构,它是结构的 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;
}

这是计算数据结构内存需求的正确方法吗(忽略内存分配的小操作系统开销)?

最佳答案

是的,非常正确。但在我看来,最好避免明确提及类型(你已经在一定程度上这样做了),并用标准库中的命名算法替换原始循环。

对于 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;
}

关于c++ - 包含 vector 的结构 vector 的字节大小,C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46021390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com