如何解决C 中的 volatile 关键字,所有变量都标记为 volatile 吗?
对不起,如果我问了一个愚蠢的问题,但由于我猜的搜索词很笨拙,我找不到答案
如果我声明三个变量如下
volatile uint16_t a,b,c;
是否将所有三个变量都声明为 volatile?
或者我真的不应该连续声明多个变量而是这样做:
volatile uint16_t a;
volatile uint16_t b;
volatile uint16_t c;
解决方法
如果我声明三个变量如下
volatile uint16_t a,b,c;
是否将所有三个变量都声明为 volatile?
是的,所有 3 个变量都是可变的。
或者我真的不应该连续声明多个变量而是这样做:
这与代码风格和个人喜好有关。通常,最好每行声明一个变量,这样更易读、更容易阅读、更容易重构,并在浏览 diff
文件输出时导致更易读的更改。
我们可以检查编译器生成的程序集,看看它是否优化了变量。
当我检查这个简单的程序时:
#include <stdio.h>
#include <stdint.h>
int main(void)
{
uint16_t a = 1,b = 1,c = 1;
printf("%hu",a);
printf("%hu",b);
printf("%hu",c);
}
在 -O3
(link) 生成的程序集是:
.LC0:
.string "%hu"
main:
sub rsp,8
mov esi,1
mov edi,OFFSET FLAT:.LC0
xor eax,eax
call printf
mov esi,eax
call printf
xor eax,eax
add rsp,8
ret
很明显,这里的变量已被优化,1
被用作参数而不是变量。
当我用 uint16_t a = 1,c = 1;
替换 volatile uint16_t a = 1,c = 1;
时,生成的程序集 (link) 是:
main:
sub rsp,24
mov edx,1
mov ecx,1
mov eax,1
mov WORD PTR [rsp+10],ax
mov edi,eax
mov WORD PTR [rsp+12],dx
mov WORD PTR [rsp+14],cx
movzx esi,WORD PTR [rsp+10]
call printf
movzx esi,WORD PTR [rsp+12]
mov edi,eax
call printf
movzx esi,WORD PTR [rsp+14]
mov edi,24
ret
在这里, volatile 就像 所有 变量一样工作。变量被创建并且没有被优化。
相比之下,如果我们将 volatile uint16_t a = 1,c = 1;
替换为 volatile uint16_t a = 1; uint16_t b = 1,c = 1;
,我们会看到只有 a
没有优化(link):
main:
sub rsp,24
mov eax,OFFSET FLAT:.LC0
mov WORD PTR [rsp+14],ax
movzx esi,WORD PTR [rsp+14]
xor eax,24
ret
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。