c++ - 将 C++ 结构填充为 2 的幂

标签 c++ struct bit-manipulation padding

我正在为嵌入式系统编写一些 C++ 代码。代码使用的 I/O 接口(interface)要求每条消息的大小(以字节为单位)是 2 的幂。现在,代码做了类似这样的事情(在几个地方):

#pragma pack(1)
struct Message
{
   struct internal_
   {
      unsigned long member1;
      unsigned long member2;
      unsigned long member3;
      /* more members */
   } internal;
   char pad[64-sizeof(internal_)];
};
#pragma pack()

我第一次尝试在 64 位 Fedora 上编译代码,其中 long 是 64 位。在这种情况下,sizeof(internal_) 大于 64,数组大小表达式下溢,编译器提示数组太大。

理想情况下,我希望能够编写一个宏来获取结构的大小并在编译时评估所需的填充数组大小,以便将结构的大小四舍五入为两个。

我看过 Bit Twiddling Hacks页面,但我不知道那里的任何技术是否真的可以在编译时评估的宏中实现。

这个问题还有其他解决方案吗?还是我应该继续这个问题并将神奇的 64 更改为神奇的 128?

最佳答案

使用模板元程序。 (根据评论进行编辑)。

#include <iostream>
#include <ostream>
using namespace std;

template <int N>
struct P
{
    enum { val = P<N/2>::val * 2 };
};

template <>
struct P<0>
{
    enum { val = 1 };
};

template <class T>
struct PadSize
{
    enum { val = P<sizeof (T) - 1>::val - sizeof (T) }; 
};

template <class T, int N>
struct PossiblyPadded
{
    T       payload;
    char    pad[N]; 
};

template <class T>
struct PossiblyPadded<T, 0>
{
    T       payload;
};

template <class T>
struct Holder : public PossiblyPadded<T, PadSize<T>::val>
{
};


int main()
{
    typedef char Arr[6];

    Holder<Arr> holder;
    cout << sizeof holder.payload << endl;

    // Next line fails to compile if sizeof (Arr) is a power of 2
    // but holder.payload always exists
    cout << sizeof holder.pad << endl;
}

关于c++ - 将 C++ 结构填充为 2 的幂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1239855/

相关文章:

c++ - 使用 Direct2d 绘制和创建非矩形位图

bit-manipulation - 溢出和进位标志

java - 有人可以解释一下这段代码中如何使用移位吗?

c++ - 如何在 C++ 中正确实现类型 "extension"函数

c++ - 在 visual studio 中更改 C++ 版本

c++ - 使用 C++ Builder 可以替代 DUnit 吗?

go - 解码 json 响应结构为空

swift - 从同一类中的结构调用方法

c# - C# 是否使用 -> 指针表示法?

c++ - 按位切换最高有效字节和最低有效字节