【问题标题】:Combined buffer from 2 pointers without copy来自 2 个指针的组合缓冲区,无需复制
【发布时间】:2018-01-28 12:19:14
【问题描述】:

我想从 2 个指针中创建组合缓冲区而不进行任何复制。

示例:top 和 bottom 都是已分配的带有只读数据的缓冲区:

uchar top[10]; uchar bottom[10];

我需要这样的东西:

struct Buffer { uchar * top, * bottom; };
Buffer buffer; buffer.top = & top; buffer.bottom = & bottom;

然后使用缓冲区作为单个数组:

process( & buffer, size20 );

process 是某个库中的函数:

void process( uchar * buffer, int size );

在 c/c++ 中有一些方法可以做到吗?

【问题讨论】:

  • (什么是 C/C++?) 好吧,这不是按原样工作吗?您的函数process 可以同时访问buffer.topbuffer.bottom
  • 进程不是我的职责。它需要单个缓冲区。
  • 流程的原型是什么? (参数的类型是什么?)我假设 uchar* 和 size_t 或 int。
  • 如果这是 C++,并且 process 是一个带有迭代器的模板,那么您可能已经编写了一些东西。如果它是一个 C 函数,那么您无能为力。无论哪种情况,您都应该问自己准备花多少工作来节省工作。有净赢吗?
  • C 和 C++ 是不同的语言。如果您没有明确的跨语言问题,请不要同时使用这两个标签。

标签: c++ c linux pointers


【解决方案1】:

没有办法定义Buffer 以便分配两个不同 数据字符串以端到端的方式结束。您必须将其定义为

struct Buffer { uchar top[10], bottom[10]; };

然后您必须直接设置这些值。

【讨论】:

    【解决方案2】:

    如果过程如下:

    process(uchar* buf, size_t n);
    

    您可以创建一个任意长度的缓冲区(20 个?),如下所示:

    uchar buffer[20];
    

    然后创建 top 和 bottom 作为指向“缓冲区”上半部分和下半部分的指针,例如:

    uchar* top = buffer;
    uchar* bot = buffer + 10;
    

    或:

    uchar* top = &buffer[0];
    uchar* bot = &buffer[10];
    

    现在可以调用进程了:

    process(buffer, 20);
    

    你也可以这样做:

    struct buffer{
        uchar top[10];
        uchar bot[10];
    };
    
    buffer buf;
    buf.top = ....
    buf.bot = ....
    
    process((uchar*)&buf, 20);
    

    【讨论】:

    • top 和 bottom 都是已分配的带有只读数据的缓冲区。
    • 我想像使用单个缓冲区一样使用它们,而不需要任何内存复制/分配。
    • 如果不能保证它们在内存中实际上彼此相邻,则无法将它们用作单个缓冲区。如果保证它们在内存中彼此相邻,并且顺序正确,那么您可能会过得去。
    • "你也可以这样做" 但你不能。在struct buffer 的成员topbot 之间很可能有许多填充字节。因为它似乎是 chars 只打包 struct 可能在这里有所帮助。
    • uchar 为 1 字节,我认为填充的可能性为零。
    猜你喜欢
    • 2015-04-04
    • 2012-06-09
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 2021-01-11
    相关资源
    最近更新 更多