C++ 包装结构是否会导致参考文件返回到本地?
我有以下代码,我正在努力理解为什么打包结构会导致警告(然后在运行时出现segfault。)首先是代码:C++ 包装结构是否会导致参考文件返回到本地?,c++,gcc,C++,Gcc,我有以下代码,我正在努力理解为什么打包结构会导致警告(然后在运行时出现segfault。)首先是代码: #include <iostream> using namespace std; template <typename T, std::size_t D, std::size_t S> struct __attribute__((packed)) C { union __attribute__((packed)) ValueType { char fil
#include <iostream>
using namespace std;
template <typename T, std::size_t D, std::size_t S>
struct __attribute__((packed)) C {
union __attribute__((packed)) ValueType {
char fill[S];
T value;
};
ValueType data_;
const T& get() const {
return data_.value;
}
friend
std::ostream& operator<<(std::ostream& str, const C& f) {
return str << f.data_.value;
}
};
template <typename T, std::size_t D>
struct __attribute__((packed)) C<T, D, D> {
T value;
const T& get() const {
return value;
}
friend
std::ostream& operator<<(std::ostream& str, const C& f) {
return str << f.value;
}
};
template <typename T, std::size_t S = 0>
struct __attribute__((packed)) D {
C<T, sizeof(T), S> c;
const T& get() const {
return c.get();
}
friend
std::ostream& operator<<(std::ostream& str, const D& f) {
return str << f.get();
}
};
template <typename T>
struct __attribute__((packed)) D<T, 0> {
T v;
const T& get() const {
return v;
}
friend
std::ostream& operator<<(std::ostream& str, const D& f) {
return str << f.get();
}
};
int main(void) {
D<int64_t> d1;
cout << d1 << endl;
D<int64_t, 8> d2;
cout << d2 << endl;
}
#包括
使用名称空间std;
模板
结构uuu属性uuu((压缩))C{
联合属性值类型{
字符填充[S];
T值;
};
ValueType数据类型;
常量T&get()常量{
返回数据值;
}
朋友
std::ostream&operator你好,尼姆,我刚刚发现这个问题可能是一个gcc编译器的BUG,你可以在这里看到参考资料,你要找的是。它的效果与你想要的一样,但更常见,更复杂
注意:使用pragma pack
#include <iostream>
using namespace std;
#pragma pack(1)
template <typename T, std::size_t D, std::size_t S>
struct C {
union ValueType {
char fill[S];
T value;
};
ValueType data_;
const T& get() const {
return data_.value;
}
};
#pragma pack()
template <typename T, std::size_t D>
struct C<T, D, D> {
T value;
const T& get() const {
return value;
}
};
template <typename T, std::size_t D>
struct C<T, D, 0> {
T value;
const T& get() const {
return value;
}
};
template <typename T, std::size_t S = 0>
struct D : C<T, sizeof(T), S> {
friend
std::ostream& operator<<(std::ostream& str, const D& f) {
return str << f.get();
}
};
#pragma pack(1)
struct E {
D<int16_t> a;
D<int64_t, 9> b;
};
#pragma pack()
int main(void) {
D<int16_t> d1;
cout << d1.get() << ' ' << sizeof(d1) << endl;
D<int64_t, 9> d2;
cout << d2.get() << ' ' << sizeof(d2) << endl;
cout << sizeof(E) << endl;
}
#包括
使用名称空间std;
#布拉格语包(1)
模板
结构C{
联合值类型{
字符填充[S];
T值;
};
ValueType数据类型;
常量T&get()常量{
返回数据值;
}
};
#pragma pack()
模板
结构C{
T值;
常量T&get()常量{
返回值;
}
};
模板
结构C{
T值;
常量T&get()常量{
返回值;
}
};
模板
结构D:C{
朋友
std::ostream&operator只是一个猜测:在下面的示例struct my_packed_struct的成员紧密地打包在一起,但是它的s成员的内部布局不是打包的,struct my_unpacked_struct也需要打包。
你也需要打包模板T!?更重要的是:你真的需要打包模板T他的属性?T
是int64\u T
看不出我是如何打包的?是的,我正在尝试解码以特定方式打包的网络数据包…您看了吗?使用对齐1,您的数据是紧密打包的。没有间隙,没有填充。它也适用于编译器。@Youka-请使用pragma pack添加它作为答案代码>实际上修复了问题,并且具有相同的效果垃圾-我认为你是对的-这看起来像是同一个bug!现在找到一个解决方法,因为它看起来不太可能被修复…嗯…是的,我尝试了一个类似但简单的代码来测试“_属性__((打包))”,我得到了相同的警告。。。。
#include <iostream>
using namespace std;
#pragma pack(1)
template <typename T, std::size_t D, std::size_t S>
struct C {
union ValueType {
char fill[S];
T value;
};
ValueType data_;
const T& get() const {
return data_.value;
}
};
#pragma pack()
template <typename T, std::size_t D>
struct C<T, D, D> {
T value;
const T& get() const {
return value;
}
};
template <typename T, std::size_t D>
struct C<T, D, 0> {
T value;
const T& get() const {
return value;
}
};
template <typename T, std::size_t S = 0>
struct D : C<T, sizeof(T), S> {
friend
std::ostream& operator<<(std::ostream& str, const D& f) {
return str << f.get();
}
};
#pragma pack(1)
struct E {
D<int16_t> a;
D<int64_t, 9> b;
};
#pragma pack()
int main(void) {
D<int16_t> d1;
cout << d1.get() << ' ' << sizeof(d1) << endl;
D<int64_t, 9> d2;
cout << d2.get() << ' ' << sizeof(d2) << endl;
cout << sizeof(E) << endl;
}