微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

迭代和取消引用未对齐的内存指针导致分段错误? GCC 优化器中的错误?

如何解决迭代和取消引用未对齐的内存指针导致分段错误? 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 寄存器。

这可以解释为什么它在以下情况下有效:

  1. 您将偏移量从 15 更改为 16 - 导致 uint16_t 指针对齐
  2. with -O2 - 禁用矢量化
  3. 删除循环/在循环中添加打印 - 也禁用矢量化

请参考以下链接,其中包含与您类似的问题以及一些非常详细的答案:

c-undefined-behavior-strict-aliasing-rule-or-incorrect-alignment

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。