gpt4 book ai didi

ios - 在 iOS 中除 -o0 之外的任何优化级别崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:51:19 25 4
gpt4 key购买 nike

以下两段代码在优化级别为 -o0 时工作正常。但是,当优化级别不是 -o0 时,第一个代码会在某个时候崩溃,但第二个不会崩溃。你能解释一下为什么吗?

1.

unsigned char* _pos = ...;

double result;

*((int*)&result) = *((int*)_pos;

2.

unsigned char* _pos = ...;
double result;

int* curPos = (int*)_pos;
int* resultPos = (int*)&result;
*resultPos = *curPos;

编辑:顺便说一句,这段代码在内联函数中。当函数未内联时,即使进行优化也不会崩溃。

最佳答案

这里的代码实际上同时产生了几个问题。首先,如前所述,代码违反了别名规则,因此根据标准,结果是未定义的。所以,严格来说,编译器可以在优化的同时做很多事情(当上面提到的代码被内联时,这实际上是你的情况)。

其次(我相信这是这里的实际问题)- 将 char* 转换为 int* 将增加指针的假定对齐方式。根据您的平台 ABI,char 可以 1 字节对齐,但 int - 至少 4(double 是 8 字节对齐,顺便说一句)。系统可以容忍未对齐的负载,但并非总是如此,例如在 arm/darwin 上,它可以容忍 4 个字节的未对齐加载,但不能容忍 8 个字节。后一种情况可能发生在编译器决定将两个连续的加载/存储为 1 合并时。由于您碰到了指针编译器的实际对齐方式,因此可能会推断出一切都是适当对齐并生成这样的 8 字节负载。

因此,简而言之 - 修复您的代码 :) 在这种特殊情况下,memcpy/memmove 将帮助您。

关于ios - 在 iOS 中除 -o0 之外的任何优化级别崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9431583/

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