【发布时间】:2018-01-16 20:50:23
【问题描述】:
为了理解严格别名和限制关键字的用法,我正在尝试下面显示的程序。在这种情况下,相同的内存位置被两个指针引用。因此,如果没有用户明确告知,编译器无法进行任何优化(即不使用限制关键字)。因此我的理解是,如果没有限制关键字,程序的输出将为 40,而使用“限制”的输出将为 30(因为“*b += *a”之后不需要从内存中读取“a”)。然而,即使有限制,输出也是 40。为什么优化没有发生?
我关注“What is the strict aliasing rule?”以便理解。
#include <stdio.h>
void merge_two_ints(int * restrict a, int * restrict b) {
*b += *a;
*a += *b;
}
int
main(void)
{
int x = 10;
int *a = &x;
int *b = &x;
merge_two_ints(a, b);
printf("%d\n", x);
return 0;
}
bash-3.2$ gcc -Wall -O3 -fstrict-aliasing -std=c99 strict_alias2.c
bash-3.2$ ./a.out 40
【问题讨论】:
-
因此我的理解是,如果没有限制关键字,程序的输出将是 40,而“限制”输出将是 30 - 不。使用
restrict它将是未定义。 -
@EugeneSh.通过使用限制,我们不是告诉编译器 a 和 b 没有指向同一个内存吗?这样就可以无忧优化了?
-
可以优化但不是必须的。你向编译器承诺了一些东西,但是你违背了你的承诺。这些东西都不好用。
-
你欺骗了你的编译器,结果就是你所期望的。如果语言滥用,这是一个完美的例子,C 语言与其他语言相比允许很多。但不要太担心。所有初学者都会经历。
-
顺便说一句,它与严格别名几乎没有关系(几乎没有)。
标签: c strict-aliasing restrict