gpt4 book ai didi

c - 如果没有明显使用,是否允许编译器删除对结构成员的赋值?

转载 作者:太空狗 更新时间:2023-10-29 17:25:13 25 4
gpt4 key购买 nike

考虑以下代码:

char buffer[256];

struct stX
{
int a;
int b;
int c;
};

void * my_memcpy ( void * destination, const void * source, size_t num );

int main()
{
struct stX x;
x.a = 1;
x.b = 2;
x.c = 3;
my_memcpy(buffer, &x.b, 2 * sizeof(int));
{
int i;
for (i = 0; i < 2 * sizeof(int); ++i) {
printf("%d\n", buffer[i]);
}
}
return 0;
}

嵌入式系统的特定编译器决定删除对 x.a 和 x.c 的赋值(因为它们从未使用过(至少不明显))。这是 c 标准允许的优化吗?

当然,将结构实例定义为 volatile 导致包含在赋值中。

gcc 和 msvc 不执行此优化(但这并不是真正的推理)。

更新:正如一些答案(正确地)假设的那样,编译器可以根据已知的 memcpy 定义进行优化,但是,这不是我的特定实现所做的。 (它在堆栈上为结构保留内存,只是不执行赋值。)假设我们用编译器没有可用定义的函数替换了 memcpy。此外,我们假设在函数调用之后使用缓冲区。我相应地更新了上面的示例代码。

最佳答案

是的,只要应用程序的可观察行为没有改变,编译器就可以自由地做任何事情。*

但这假设您有一个符合标准的程序,即具有明确定义的行为的程序。您的代码没有表现出明确定义的行为;通过取消引用指向 x.b 的指针来访问 x.c 是无效的(这是您隐式要求 memcpy 执行的操作)。

更新:以上段落可能不正确;请参阅评论中的讨论...


<子>*更严格的定义见C99标准的5.1.2.3节:

Accessing a volatile object, modifying an object, modifying a file, or calling a function that does any of those operations are all side effects, which are changes in the state of the execution environment.

...

An actual implementation need not evaluate part of an expression if it can deduce that its value is not used and that no needed side effects are produced

关于c - 如果没有明显使用,是否允许编译器删除对结构成员的赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14525374/

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