首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >swizzle/修改数组访问

swizzle/修改数组访问
EN

Stack Overflow用户
提问于 2018-09-12 17:23:55
回答 1查看 164关注 0票数 0

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

代码语言:javascript
复制
char bytes[100];

我希望有另一个数组来更改原始数组的访问方式。如果我们可以将引用放在数组中,它将如下所示:

代码语言:javascript
复制
char& bytes_ref[50];
for(size_t i = 0; i < 50; i++){
    bytes_ref[i] = bytes[i * 2];
}

尽管引用数组无效。我想出了这个理论上我想做的事:

代码语言:javascript
复制
#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格式表示图像。我想要创建一个单独的数组,它引用原始缓冲区中的字节,但是占用一半的像素,有效地调整图像的大小。

我必须把一个字符**传给一个没有控制的图书馆。

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-12 21:25:50

我认为每个元素不能使用少于一个指针的内存。

如果需要将char*数组传递给不受控制的库,我理解您必须分配整个数组,因为这正是库所期望的。该守则希望:

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

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

代码语言:javascript
复制
f(bytes_ref.data());

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

代码语言:javascript
复制
class Wrapper {
public:
    Wrapper(char *origin) : m_origin(origin) {}
    char* operator[](size_t index) {return m_origin + 2*index;}
private:
    char *m_origin;
};

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52300518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档