回旋/修改阵列访问
swizzle/modify array access
我有一个字节数组,我想改变它的访问方式。这是数组:
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 个元素的指针。
相关文章:
- 回旋/修改阵列访问
- 访问特定阵列位置/索引时出现分段错误
- 如何将1D阵列访问为2D阵列
- 分配/访问2d阵列,使得2d子块是连续的
- 将积分类型的数组作为另一个不相关的积分类型的阵列进行访问的安全且符合标准的方法
- 访问多个阵列时 CPU 缓存的作用是什么?
- OpenMP 环路阵列访问中的错误共享
- 访问字符阵列中不可用的内存位置(超出范围值)
- 将std ::向量转换为阵列和当时的p/调用它会导致访问违规例外,在编组期间mscorlib.dll
- C 使用坐标结构的访问阵列元素
- 大多数令人烦恼的解析,并访问阵列
- C 私有阵列访问和存储
- 是二维阵列访问/修改时间组
- 阵列访问期间出现分段错误
- X86 MASM-通过并访问2D阵列
- 动态2D阵列访问侵犯剩余
- 为什么2D数组访问要比1D阵列访问更快
- 在循环的停止条件下访问阵列值是安全的吗?
- 快速访问阵列中的数据
- 尝试访问阵列的隔离错误