gpt4 book ai didi

c - #define 与 static const 的优化(在 avr-gcc 中)

转载 作者:行者123 更新时间:2023-12-03 17:12:58 26 4
gpt4 key购买 nike

虽然我欢迎在一般范围内回答这个问题,但我主要要求 avr-gcc 使其不要太宽泛。

我看了一些问题,特别是 thisthis一。他们主要关注语义差异,例如static const 不能用来代替常量表达式。然而,虽然一般都在谈论内存分配,但他们并没有谈论优化。

让我们看一个例子:

typedef struct {
GPIO_TypeDef *port;
uint8_t pin;
} gpio_pin_t;

static inline void gpio_pin_set(gpio_pin_t gpio, bool set) {
if(set) GPIO_SetBits (gpio.port, 1 << gpio.pin);
else GPIO_ResetBits(gpio.port, 1 << gpio.pin);
}

//elsewhere including above definitions

static const gpio_pin_t gpio_pin = {GPIOE, 8};

void some_function(bool enable) {
gpio_pin_set(gpio_pin, enable);
}

如您所见,我正在使用结构,所以第三种既定方式(枚举)在这里不是一个选项

我可以期望 gcc 优化内联函数中的 gpio.portgpio.pin 访问吗?如果不是,为什么会这样,gcc 在看到 const 时会应用其他优化吗?

总的来说,通过使用 static const 变量而不是定义,我在优化方面失去了什么,尤其是超越简单的整数常量?

最佳答案

这取决于编译器的实现。

如果您从未获取它的地址并且未导出符号(默认情况下对于 C,因此您必须使用 static ),那么优化器应该启动并优化它。对于简单类型( intfloat ),您可以合理地期望它可以全面工作,但对于 struct s - 最好自己检查一下编译器做了什么。对于像我的 GCC 这样的简单结构,优化它,消除结构并直接传递它的值,将常量加载到 CPU 寄存器。对于较大的结构,它可能会认为不值得。

您可以生成要检查的代码的汇编列表:

avr-gcc -O<opt> -S somefile.c

gcc -O<opt> -S somefile.c

不要忘记优化级别!

使用 #define糟透了,因为预处理器真的很笨——它只是在编译之前逐字替换代码。使用 const为您购买更好的类型安全性。考虑这个例子:

#define BYTE_VALUE 257
static const uint8_t sc_value = 257; // at least will show warning
int my_byte = BYTE_VALUE; // no warning, but obviously it's a bug!

关于c - #define 与 static const 的优化(在 avr-gcc 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28879108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com