如何为带GCC的回路体对齐C?

如何为带GCC的回路体对齐C?,c,gcc,for-loop,alignment,memory-alignment,C,Gcc,For Loop,Alignment,Memory Alignment,在我们的嵌入式体系结构中,我们有一个64位IAB(指令对齐缓冲区)。为了优化提取序列,要求循环体开始与8字节边界对齐 在汇编中使用.balign指令很容易实现这一点,但我找不到提示C编译器对齐代码的语法 尝试使用.balign指令在带有内联程序集的for循环前面进行操作不起作用,因为它对齐for循环序言(设置),而不是循环体本身 在asm()行位于循环内部时执行相同操作,会将nop-s添加到循环体中,从而消耗宝贵的周期 编辑1:假设代码为: __asm__ volatile("nop")

在我们的嵌入式体系结构中,我们有一个64位IAB(指令对齐缓冲区)。为了优化提取序列,要求循环体开始与8字节边界对齐

在汇编中使用
.balign
指令很容易实现这一点,但我找不到提示C编译器对齐代码的语法

尝试使用
.balign
指令在带有内联程序集的for循环前面进行操作不起作用,因为它对齐for循环序言(设置),而不是循环体本身

asm()
行位于循环内部时执行相同操作,会将
nop
-s添加到循环体中,从而消耗宝贵的周期

编辑1:假设代码为:

    __asm__ volatile("nop");  
    __asm__ volatile("nop");  

    for (j0=0; j0<N; j0+=4)
    {
        c[j0+ 0] = a[j0+ 0] + b[j0+ 0];
        c[j0+ 1] = a[j0+ 1] + b[j0+ 1];
        c[j0+ 2] = a[j0+ 2] + b[j0+ 2];
        c[j0+ 3] = a[j0+ 3] + b[j0+ 3];
    }
\uuuu asm\uuuuuuu volatile(“nop”);
__挥发性物质(“nop”);

对于(j0=0;j0嗯,这不是GCC的
-falign loops
选项的目的吗?

因此,本质上,您希望
nop
-s将导致循环体对齐,但您希望这些
nop
-s在循环序言之前?@ruakh-是的,尽管我不关心
nop
-s是否在序言中生成,只要因为循环末尾的分支指令指向对齐的内存位置。明白。这是一个很好的问题!嗯,这不是GCC的
-falign loops
选项的目的吗?@R…-这似乎是个诀窍!请给出一个答案,这样我就可以重复并接受它。是的,但是如果你只想影响一个循环怎么办?GCC是否有ny解决方案?对于单个函数,您可以使用
#pragma GCC optimize
或等效属性。但我不知道您是否可以在单循环级别执行此操作。如果没有其他方法,您可以通过将循环放在嵌套函数中并将属性放在嵌套函数上来完成此操作…?Targeted单函数优化仍然比项目范围内的选项好得多,因为它在某些情况下是好的(热循环),在其他情况下是坏的(罕见循环)。不幸的是,无论是
#pragma GCC optimize“align loops=xx”
还是
u属性((optimize(“align loops=xx”))
在我的测试中似乎都不会产生任何效果(在生成的二进制文件上使用相同的
md5sum
)。