c - 有没有办法告诉 gcc/clang 将一些代码块放在一起?

标签 c gcc clang

由于一些丑陋的原因,我不会在这里讨论,我需要对我的 C 编译器(gcc/clang)如何将函数生成的程序集组合在一起进行一些控制。假设我在函数 f 中有一段代码,由一对标签 start 标记和stop :

void f() {
  ...
start:
   x = 0;
   y = -1;
   return;
stop:
  ...
}

我希望为上述 block 生成的程序集是连续的指令序列,就像 C 指令一样。但 C 编译器可能会选择优化,例如,如果同一指令在源程序中重复多次,则共享同一指令的汇编代码。上面的例子中,如果f中有很多其他地方哪里y = -1; return ,情况可能是编译器决定为这一对 C 语句仅生成一个汇编指令序列,并在任何时候找到 y = -1; return 时向其发出跳转指令。 。除了将语句包含在函数中(这在我的用例中会非常麻烦)或汇编编程(这会在可能的情况下违背使用高级语言的目的)之外,是否有其他方法可以防止这种情况发生?还是我完全没有希望了?

最佳答案

我怀疑这确实是一个 X-Y 问题,但由于您似乎不愿意讨论想要按照您所说的去做的原因,所以我将回答您实际提出的问题。

您提示用汇编语言编写代码会“违背使用高级语言的目的”,但事实上这正是您想要做的。如果您关心函数的汇编代码的细节,那么您应该用汇编语言编写。如果您使用高级编译语言编写,那么您就可以说您同意编译器选择机器代码详细信息。无论如何,除了禁用优化(无论如何不能 100% 保证做你想做的事情)之外,GCC 和 clang 不提供任何方法来对 C 源代码生成进行你所描述的控制。

但是,您不一定需要用汇编语言编写整个函数,并且您当然不需要为了不需要如此精细控制的部分而放弃 C。 GCC/clang 支持内联汇编,使用它您可以在汇编中只编写您特别关心的部分。据我所知,您可以将内联汇编视为黑盒——不受任何优化,并且不会相对于周围代码重新排序。

关于c - 有没有办法告诉 gcc/clang 将一些代码块放在一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40133185/

相关文章:

Coverity和 "Failed to initialize ICU, try using the --prevent-root option"

c - 获取 AVFrame 点值

c - 如何发明平方根代码?

c - init-on-first-use 函数的 gcc 属性

cmake - 为什么 -DCMAKE_EXPORT_COMPILE_COMMANDS 不创建 compile_commands.json 文件

c - 如何在所有前台进程或特定前台进程之前运行后台进程?

linux - ARM 上未对齐内存访问的函数

c++ - 忙等待循环中是否需要内存屏障或原子操作?

c - 适用于 gcc c11,但在 Clang 3.6 c11 上我得到 malloc() : memory corruption (fast): 0x0000000000fb8620

python - 如何在 Python 中查找已安装库的版本?