初始化静态初始化的每个结构字符缓冲区的最佳方法是什么?

时间:2011-02-08 04:30:11

标签: c++ templates struct buffer low-level

继续Absolute fastest (and hopefully elegant) way to return a certain char buffer given a struct type我现在想要逐个初始化每个结构的每个静态字符buf。

即:

#pragma pack(push, 1);

struct Header {
   int a;
   int b;
   char c;
};

struct X {
   int x;
   int y;
};

struct Y {
   char someStr[20];
};

struct Msg {
   Header hdr;
   union {
      X x;
      Y y;
   };
};

#pragma pack(pop)

我们有:

tempate<typename T>
struct Buffer {
    static char buffer[sizeof(T)];
}

template<class T>
inline char* get_buffer() {
  return Buffer<T>::buffer;
}

我正在寻找的两件事是:

  1. 正好有2个缓冲区:1个用于X,1个用于Y.它们应该是sizeof(Msg.hdr)+ sizeof(Msg.x)和sizeof(Msg.hdr)+ sizeof(Msg.y)的长度),分别。
  2. 每个缓冲区将在应用程序生命周期中被大量检索,并且只有一些字段确实(或需要)更改。 2A。由它的char缓冲区支持的X的Msg应初始化为m.hdr.a = 1,m.hdr.b = 0;对于Msg Y,它应该是m.hdr.a = 16; m.hdr.b = 1;举个例子。
  3. 应用程序将经常获取这些缓冲区作为由X或Y支持的类型Msg(应用程序将知道哪一个),然后仅更改x和y或someStr,然后将其输出到文件,例如然后重复。
  4. 只是想知道@ 6502和@Fred Nurk在这些优秀的例子上有什么好的方法来优雅地初始化这两个缓冲区,同时又是人类可读的。我希望继续使用结构并尽可能地限制reinterpret_cast&lt;&gt;()的使用,因为可能存在可能出现的别名问题。

    如果我不清楚,请告诉我,我会尽力回答任何问题和/或编辑此问题说明。

    感谢。

    ***更新:这些缓冲区的使用模式是我将发送char * out到流或文件。因此我需要获取一个指向底层数据的char *指针。但是我需要通过它们的结构来处理char缓冲区,以提高可读性和方便性。此char字符缓冲区也应该解耦,并且不一定包含或“附加”到结构中,因为结构几乎位于单独的文件中,并且在其他不需要/不需要缓冲区的地方使用。只是做一个简单的静态X x;静Y y;对于X的Msg缓冲区,是否足够或者更好的缓冲区长度为Header + X?然后以某种方式只保留一个char *引用每个Msg的X和Y?我可能会遇到别名问题吗?

1 个答案:

答案 0 :(得分:1)

如果您要用C语言编写它,您可以查看一个相当常见的C编译器扩展,称为“强制转换为联合类型”,但在C ++中它不再存在。

在C ++中无法绕过reinterpret_cast&lt;&gt;您需要什么,但至少可以通过计算转换为联合的NULL指针上的成员偏移量,然后在将其转换为联合之前从数据指针中减去此偏移量来相当安全地执行此操作。我相信在大多数编译器中,偏移量将为0,但最好是安全起见。

template<class T>
union Aligner {
    T t;
    char buffer[sizeof(T)];
};

template<class T>
inline char* get_buffer(T* pt) {

    return reinterpret_cast<Aligner<T>*>(reinterpret_cast<char*>(pt) - reinterpret_cast<ptrdiff_t>(&reinterpret_cast<Aligner<T>*>(NULL)->t))->buffer;
}