通过缓冲区进行通信的类 - 最佳实践?

时间:2016-09-14 08:53:00

标签: c++ pointers buffer

我开始只是作为一个实验来讨论这个话题。假设你有两个班级。 "接收器" class必须复制存储在由" sender"维护的位置的内存块。类维护自己的内存块。例如,发送方类可以对OpenGL渲染引擎进行建模,该引擎生成描绘特定图形场景的位图,然后将这些位图作为原始缓冲区数据传递给接收方类,该接收方类可以对在应用程序的用户界面中显示这些图像的GUI元素进行建模。 。

发件人类声明如下:

class Sender {
public:
    Sender(size_t = 0);
    ~Sender();
    bool isEmpty();
    void generateRandomData();
    void exposeBuffer(unsigned char*&);
    void exposeBufferSize(size_t&);
private:
    size_t buffer_size;
    unsigned char* buffer;
};

虽然接收器类声明如下:

class Receiver {
public:
    Receiver(size_t = 0);
    Receiver(Sender&);
    ~Receiver();
    bool isEmpty();
    void receive(Sender&);
private:
    size_t buffer_size;
    unsigned char* buffer;
};

主要功能内部发生的通信逻辑:

int main() {
    int status(EXIT_SUCCESS);
    Sender my_sender(10);
    my_sender.generateRandomData();
    Receiver my_receiver(my_sender);
    my_receiver.receive(my_sender);
    return status;
}

用于通信的重要方法定义如下

接收是作为Receiver类的成员函数实现的:

void Receiver::receive(Sender& sender) {
    size_t sender_buffer_size;
    sender.exposeBufferSize(sender_buffer_size);
    if (sender_buffer_size != buffer_size) {
        std::cout << "ERROR : receive : Incompatible buffer sizes!" <<
            std::endl;
        return;
    }
    unsigned char* sender_buffer = nullptr;
    sender.exposeBuffer(sender_buffer);

    std::memcpy(buffer, sender_buffer, buffer_size);
}

在上面的代码中,我关注的最关键的一点是Sender的exposeBuffer成员函数的实现:

void Sender::exposeBuffer(unsigned char* &to) {
    to = buffer;
}

我主要担心的是:

  1. 这种传输原始缓冲区数据的实现是否安全并被认为是一种好的做法?
  2. 我可以做的比通过将其位置复制到引用传递的指针(Sender :: exposeBuffer)来公开Sender缓冲区更好吗
  3. 我是否忽略了这样做的标准方法,我可以在某处阅读?

0 个答案:

没有答案