考虑以下代码:
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;
}
嵌入式系统的特定编译器决定删除对 xa 和 xc 的分配(因为它们从未使用过(至少不明显))。这是 c 标准允许的优化吗?
当然,将结构实例定义为 volatile 会导致包含的分配。
gcc 和 msvc 不执行此优化(但这并不是真正的推理)。
更新:正如一些答案(正确)假设的那样,由于 memcpy 的已知定义,编译器可以优化,但是,这不是我的特定实现所做的。(它为堆栈上的结构保留内存,只是不执行分配。)假设我们用编译器没有可用定义的函数替换了 memcpy。另外,假设在函数调用之后使用缓冲区。我相应地更新了上面的示例代码。