我正在为嵌入式系统编写一些 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/