如何打包模板class?
How can I pack a template class?
我使用了压缩模板class。根据 this 我应该用 #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() 中的第一行,那么它就可以工作。所以我的问题是如何在模板 class 实例化上使用包?有没有办法在同一个程序中同时使用打包和解包模板 class?
更新:如果我使用gcc-5.2.1,那么它会正确输出5。同样对于以下程序,我得到相反的结果(gcc-4.4.7 为 5,5.2.1 为 8):
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 上得到一致的结果?
对我有用
#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 的定义放在 header 中(但不要使用 #pragma once)并避免代码重复:
#pragma pack(1)
namespace Packed
{
#include "S.h"
}
#pragma pack()
namespace NotPacked
{
#include "S.h"
}
我使用了压缩模板class。根据 this 我应该用 #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() 中的第一行,那么它就可以工作。所以我的问题是如何在模板 class 实例化上使用包?有没有办法在同一个程序中同时使用打包和解包模板 class?
更新:如果我使用gcc-5.2.1,那么它会正确输出5。同样对于以下程序,我得到相反的结果(gcc-4.4.7 为 5,5.2.1 为 8):
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 上得到一致的结果?
对我有用
#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 的定义放在 header 中(但不要使用 #pragma once)并避免代码重复:
#pragma pack(1)
namespace Packed
{
#include "S.h"
}
#pragma pack()
namespace NotPacked
{
#include "S.h"
}