gpt4 book ai didi

c++ - 可以将多维 std::array 视为连续的数据 block 吗?

转载 作者:行者123 更新时间:2023-12-05 04:28:18 26 4
gpt4 key购买 nike

能否将多维std::array 视为一个连续的数据 block ?也就是说,这是否合法:

#include <array>
#include <iostream>
#include <cstring>

// just to show what's happening, otherwise unrelated
template<typename T>
void print_array(const T &data)
{
for(const auto &row : data) {
for(const auto &item: row) {
std::cout << static_cast<char>('a' + item);
}
std::cout << '\n';
}
std::cout.flush();
}

// function to fill a block of bytes
void filler(uint8_t *data, size_t size) {
while(size != 0) {
*(data++) = size % 27; // just a changing number
--size;
}
}

// test code
int main()
{
std::array<std::array<uint8_t, 30>, 20> data;
std::memset(&data, 0, sizeof(data)); // use &data, is this legal?
print_array(data); // seems to print all 'a' ok...
std::cout << std::endl;
filler(data.begin()->begin(), 30*20); // use pointer to first item, legal?
print_array(data); // seems to print alphabet pattern ok...
}

打印输出是人们可能期望的,首先是字母 a 的字符矩形,然后是填充字符 a-z 的矩形.

同一主题至少讨论herehere ,但我认为多维数组可能是不同的情况。


此外,即使 static_assert(sizeof(data) == sizeof(uint8_t)*20*30) 成立,所以数据在内存中是连续的,没有间隙,即使这样也能保证什么吗?还是使用相同的指针通过索引访问不同的数组无论如何都是非法的?

最佳答案

你可能想看看 this问题及其接受的答案。基本上,实现将有一个普通数组 T[N] 作为 std::array 的第一个成员,但没有什么能阻止他们在之后放置成员,在这种情况下 sizeof(数据) != 30 * 20
这似乎有点牵强,但有报道称发生了这种情况:link .因此,如果您希望您的代码“合法”,您将不得不独立对待每个内部数组并迭代它们,可能会在每个数组的末尾跳过一些空间。如果这是您真正需要做的事情(我对此深表怀疑),您可以执行 static_assert 以查看 std::array 的大小是否符合其应有的大小。

关于c++ - 可以将多维 std::array 视为连续的数据 block 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72644813/

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