de-serializaing时的gccclang优化

某些gcc / clang编译器优化允许重新排序程序集中代码的执行(例如,对于gcc:-freorder-blocks -freorder-blocks-and-partition -freorder-functions)。在按特定顺序对数据结构进行取消/序列化时,使用此类优化是否安全?

例如:

void write(int* data,std::ofstream& outstream)
{
  outstream.write(reinterpret_cast<char*>(data),sizeof(int));
}

void read(int* data,std::ifstream& instream)
{
  instream.read(reinterpret_cast<char*>(data),sizeof(int));
}

void serialize()
{
  std::ofstream ofs("/somePath/to/some.file");
  int i = 1;
  int j = 2;
  int k = 3;

  write(i, ofs);
  write(j, ofs);
  write(k, ofs);

  ofs.close();
}

void deserialize()
{
  std::ifstream ifs("/somePath/to/some.file");
  int i;
  int j;
  int k;

  read(i, ifs);
  read(j, ifs);
  read(k, ifs);

  ifs.close();
}

最佳答案:

1 个答案:

答案 0 :(得分:1)

-freorder-blocks-freorder-blocks-and-partition-freorder-functions都会影响代码在可执行文件中的排列顺序:

  • -freorder-blocks允许gcc重新排列汇编代码的直线块,它们组合起来构成您的函数,以尽量减少CPU可能产生的分支预测错失次数。

    < / LI>
  • -freorder-functions获取编译器认为不可能执行的函数,并将它们移动到远处可执行文件的一部分。这样做的目的是尝试将尽可能频繁执行的代码打包到尽可能少的内存中,以便尽可能地从指令缓存中受益。

  • -freorder-blocks-and-partition-freorder-functions类似,但在汇编程序块级别。如果代码中有if (unlikely(foo)) { x = 1; }分支,则编译器可能会选择代表x = 1;的代码并将其移除经常执行的代码。

这些都不会影响程序的控制流程。所有优化都将保证,如果您将i写入文件,然后j写入文件,那么仍将是应用优化后观察到的内容。

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复