C GCC中的功能对齐

Suk*_*nto 7 c gcc alignment memory-alignment

我正在尝试使用'aligned(16)'属性将函数字节对齐到16字节边界.我做了以下事情: void __attribute__((aligned(16))) function() { }

(来源:http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html)

但是当我编译(gcc foo.c;没有使用makefile或链接器脚本)时,我收到以下错误:

FOO.c:99:错误:可能没有为'function'指定对齐

我尝试调整到4,8,32等,但错误仍然相同.我需要这个来为基于powerpc的处理器调整中断服务程序.这样做的正确方法是什么?

Gon*_*alo 8

为什么不在编译时将-falign-functions = 16传递给gcc?

  • 是的我可以做到这一点,但这会将所有函数对齐到16byte,而我只需要ISR就可以对齐16字节.但是,如果没有其他选择,我将不得不这样做. (4认同)
  • @Sukanto,执行此操作,然后将该函数放在单独的C文件中. (4认同)
  • 那太容易了,不是吗? (3认同)

Phi*_*rad 7

根据我对此GCC问题的回答,您可以尝试使用#pragma指令,如下所示:

    #pragma GCC push_options
    #pragma GCC optimize ("align-functions=16")

    //add 5 to each element of the int array.
    void add5(int a[20]) {
        int i = 19;
        for(; i > 0; i--) {
            a[i] += 5;
        }
    }

    #pragma GCC pop_options
Run Code Online (Sandbox Code Playgroud)

#pragma push_optionspop_options宏用于控制的范围optimize编译的效果.有关这些宏的更多详细信息,请参阅GCC文档.


或者,如果您更喜欢GCC的属性语法,您应该可以执行以下操作:

    //add 5 to each element of the int array.
    __attribute__((optimize("align-functions=16")))
    void add5(int a[20]) {
        int i = 19;
        for(; i > 0; i--) {
            a[i] += 5;
        }
    }
Run Code Online (Sandbox Code Playgroud)