如何解决迭代和取消引用未对齐的内存指针导致分段错误? GCC 优化器中的错误?
for col in dfx.columns[1:]:
for i in range(len(dfx[col][0].split(','))):
dfx[f'{col}{i+1}'] = (dfx[col].str.split(',',expand = True)[i])
dfx = dfx[['name','age','age1','age2','age3','job','job1','job2','job3','gender','gender1','gender2']]
dfx
我找到了一些讨论这个问题的链接:
https://github.com/samtools/htslib/issues/400
https://github.com/xianyi/OpenBLAS/issues/1137
但他们用处理器术语说话。有人可以确认这个错误存在吗?
ps
我使用 -O2 优化标志运行代码。没有崩溃
解决方法
问题确实在 uint16_t
指针(应该是 2)的对齐中加了下划线,结合 -O3
编译器正在尝试使用矢量化 (SIMD) 优化您的循环,因此尝试将未对齐的参数加载到 SSE 寄存器。
这可以解释为什么它在以下情况下有效:
- 您将偏移量从 15 更改为 16 - 导致
uint16_t
指针对齐 - with
-O2
- 禁用矢量化 - 删除循环/在循环中添加打印 - 也禁用矢量化
请参考以下链接,其中包含与您类似的问题以及一些非常详细的答案:
c-undefined-behavior-strict-aliasing-rule-or-incorrect-alignment
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。