回旋/修改阵列访问

swizzle/modify array access

本文关键字:访问 阵列 修改 回旋      更新时间:2023-10-16

我有一个字节数组,我想改变它的访问方式。这是数组:

char bytes[100];

我想有另一个数组来更改访问原始数组的方式。如果我们可以将引用放在数组中,它将看起来像这样:

char& bytes_ref[50];
for(size_t i = 0; i < 50; i++){
bytes_ref[i] = bytes[i * 2];
}

尽管引用数组无效。我想出了这个,理论上可以做到我想要的:

#include <iostream>
struct Byte {
char* ref;
Byte(){}
Byte(char& c){
ref = &c;
}
operator char&() const {
return *ref;
}
};
int main(){
char bytes[100];
Byte bytes_ref[50];
for(size_t i = 0; i < 50; i++){
bytes_ref[i] = bytes[i * 2];
}
}

虽然这就像我想要的那样工作,但它占用了大量空间。

有没有办法在不占用每个条目 7 个字节的情况下做到这一点?我的直觉是否定的,但我希望C++中可能有某种特殊的功能可以做到这一点,或者可以进行一些直接的内存操作和访问。

我想这样做的原因是我有一个字节数组,表示 NV21 格式的图像。我想创建一个单独的数组,该数组引用原始缓冲区中的字节,但占用一半的像素,从而有效地动态调整图像大小。

我必须将字符**传递给不受控制的库。

提前感谢!

我认为你不能使用比每个元素一个指针更少的内存

如果您需要将char*数组传递给不受控制的库,我知道您必须分配整个数组,因为这是库所期望的。代码如下所示:

std::array<char*, 50> bytes_ref;
for(size_t i = 0; i < bytes_ref.size(); ++i){
bytes_ref[i] = &bytes[i * 2];
}

然后,您可以将数组传递为:

f(bytes_ref.data());

如果您不需要使用char**,您将有更多选择。您可以使用std::reference_wrapper尽管它的大小类似于指针。如果您总是必须跳过 2 个元素,您可以为此创建一个对象。例如:

class Wrapper {
public:
Wrapper(char *origin) : m_origin(origin) {}
char* operator[](size_t index) {return m_origin + 2*index;}
private:
char *m_origin;
};

上面将使用 [] 运算符返回指向每 2 个元素的指针。