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

Fast default ordering for POD class in C++

本文关键字:默认 排序 POD C++      更新时间:2023-10-16

假设我在C++中有一些POD struct Foo,我想把它放入像set<Foo>这样的有序容器中。我不在乎使用哪种排序,只在乎它是一致的和快速的。最好的方法是什么?

更具体地说,假设我在一台带有sizeof(long)==8的64位机器上。假设类别为:

 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 
 }

CCD_ 4字段只是为了确保大小是8的倍数。

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

编译器能自动为我做这件事吗?或者,我是否必须用字段unsigned long data[8]定义union,或者在Foooperator<方法中将Foo *强制转换为unsigned long *

请注意,如果没有填充字段,则必须生成5个unsigned long比较,然后生成longshortchar比较。这整件事有点乱。

这个问题肯定一直都会出现,所以我猜有一些最好/最好的方法来处理它。

如果您想使用结构实际值进行比较,最好定义一个operator<,它具有更多的逻辑,并在字段之间提供某种逻辑排序。

如果您只想对对象进行排序以便快速访问,您可以只保留指针。这些只是数字,可以排序。

如果您想使用实际的结构数据,但不关心成员之间的任何排序,则可以将memcmpsizeof(Foo)一起使用。