gpt4 book ai didi

c++ - 如何打包模板类?

转载 作者:搜寻专家 更新时间:2023-10-31 02:15:32 24 4
gpt4 key购买 nike

我使用了打包模板类。根据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() 中的第一行,那么它就可以工作。所以我的问题是如何在模板类实例化上使用 pack ?有没有办法在同一个程序中同时使用打包和解包的模板类?

更新:如果我使用 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"
}

关于c++ - 如何打包模板类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38400385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com