我有一个字节数组,我想改变它的访问方式。下面是数组:
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格式表示图像。我想要创建一个单独的数组,它引用原始缓冲区中的字节,但是占用一半的像素,有效地调整图像的大小。
我必须把一个字符**传给一个没有控制的图书馆。
提前感谢!
发布于 2018-09-12 21:25:50
我认为每个元素不能使用少于一个指针的内存。
如果需要将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个元素的指针。
https://stackoverflow.com/questions/52300518
复制相似问题