gpt4 book ai didi

c - 编译器是否读取代码并优化随机内存分配?

转载 作者:太空宇宙 更新时间:2023-11-04 02:25:09 25 4
gpt4 key购买 nike

我有一段代码,我在其中声明了一个指针(名为“removed”),类型为名为 DLINKED_LIST_NODE 的结构。

DLINKED_LIST_NODE curr = dlinked_list_goto_idx(list, idx, false);
DLINKED_LIST_NODE removed;

if(curr->next != NULL)
removed = curr->next;
else {
printf("Error @ dlinked_list_remove: No such index.\n");
exit(1);
}

dlinked_list_goto_idx 只是返回双向链表的起点。所以删除将是列表的头部。

当我调试代码时,dlinked_list_goto_idx 返回列表本身(这是起始节点)并且我可以看到它的地址。然后 removed 被声明,我再次看到它的地址。

在执行 removed = curr->next; block 之前,我看到 removed 的地址实际上与 curr->next.

编译器这样做是为了优化代码还是我看不到明显的东西?

这是当我调试到声明 removed 时的样子。 https://pasteboard.co/HHe6eQE.png

这是调试屏幕,您可以在其中看到 curr->nexthttps://pasteboard.co/HHe7dF8.png

最佳答案

如果您使用除 -O0 之外的任何内容进行编译或其等价物 - 即“无优化” - 编译器很可能会将您的代码重写为:

register DLINKED_LIST_NODE curr = dlinked_list_goto_idx(list, idx, false);
register DLINKED_LIST_NODE removed = curr->next;

if(removed == 0) {
printf("Error @ dlinked_list_remove: No such index.\n");
exit(1);
}

换句话说,它可能选择了拉removed = curr->next直到声明点,然后针对寄存器 var removed 测试 NULL (0)因为测试一个寄存器的内容是否为零通常是一个非常便宜的测试,如果零标志是由赋值设置的,实际上可能甚至不需要测试,这可能取决于架构。

这里的要点是 - 不要调试优化代码,除非未优化版本有效而​​优化版本无效(这可能由于各种问题而发生)。

祝你好运。

关于c - 编译器是否读取代码并优化随机内存分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52681410/

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