我使用了压缩模板类。根据{{3}}我应该用#pragma pack包装它,如下例所示:
#include <iostream>
#pragma pack(1)
template<typename X>
struct S {
int a;
X b;
};
#pragma pack()
int main()
{
std::cout << sizeof(S<char>) << "\n";
}
在我的centOS6上使用gcc-4.4.7,程序输出8,这意味着pack(1)不起作用。然后我尝试将main()更改为:
int main()
{
std::cout << sizeof(S<char>) << "\n";
#pragma pack(1)
std::cout << sizeof(S<char>) << "\n";
#pragma pack()
}
令人惊讶的是它仍然没有用。如果我在main()中注释掉第一行,那么它就可以了。所以我的问题是如何在模板类实例化中使用pack?无论如何在同一个程序中同时使用打包和解压缩的模板类?
更新:如果我使用gcc-5.2.1,那么它正确输出5。同样对于以下程序,我得到相反的结果(5个用gcc-4.4.7和8个用5.2.1):
template<typename X>
struct S {
int a;
X b;
};
int main()
{
#pragma pack(1)
std::cout << sizeof(S<char>) << "\n";
#pragma pack()
}
为什么gcc-4.4.7和5.2.1表现不一样?哪一个是正确的?反正是否有不同版本的gcc获得一致的结果?
答案 0 :(得分:2)
它对我有用
#include <iostream>
#pragma pack(1)
namespace Packed
{
template<typename X>
struct S {
int a;
X b;
};
template struct S<char>;
}
#pragma pack()
namespace NotPacked
{
template<typename X>
struct S {
int a;
X b;
};
template struct S<char>;
}
int main()
{
std::cout << sizeof(Packed::S<char>) << "\n";
std::cout << sizeof(NotPacked::S<char>) << "\n";
}
您可以将S的定义放入标题(但不包括#pragma一次)并避免代码重复:
#pragma pack(1)
namespace Packed
{
#include "S.h"
}
#pragma pack()
namespace NotPacked
{
#include "S.h"
}