C++ 包装结构是否会导致参考文件返回到本地?

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

我有以下代码,我正在努力理解为什么打包结构会导致警告(然后在运行时出现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 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;
}