C++中POD类的快速默认排序

kdo*_*dog 1 c++ containers stl comparison-operators

假设我struct Foo在C++中有一些POD ,我想将它放入一个有序的容器中set<Foo>.我不关心使用哪种排序,只关注它是否一致且快速.做这个的最好方式是什么?

更具体地说,我说我在64位机器上sizeof(long)==8.说课程是:

 struct Foo{
  long key; //8 bytes : 8 total
  int fum;  // 4 bytes : 12 total
  short n;  // 2 bytes : 14 total
  short n[3];  //6 bytes : 20 total
  char bar[5];  // 5 bytes : 25 total
  char name[23]; //22 bytes : 47 total
  char padding[1]; // 1 byte : 48 total 
 }
Run Code Online (Sandbox Code Playgroud)

padding字段只是为了确保大小为8的倍数.

请注意,它sizeof(Foo)是48,因此其内容可以用6 unsigned long秒表示,这显然是进行比较的最佳方式,而不是遍历每个字段.

编译器可以自动为我执行此操作吗?还是我必须要么定义union一个字段unsigned long data[8],或投下Foo *unsigned long *在我的operator<方法Foo

请注意,如果没有填充字段,则必须生成5次unsigned long比较,然后比较a long,a shortchar比较.整件事情有点乱.

这个问题必须一直出现,所以我猜有一些最佳/最好的方法来处理它.

Yoc*_*mer 5

如果要使用struct实际值进行比较,最好定义一个operator<具有更多逻辑的逻辑,并在字段之间提供某种逻辑顺序.

如果您只是希望对象可以快速访问,那么您可以保持指针.这些只是数字,可以排序.

如果你想用实际的结构数据,但不关心成员之间任何类型的排序,你可以使用memcmpsizeof(Foo).