【问题标题】:Segmentation fault in capturing aligned variables in lambdas在 lambdas 中捕获对齐变量时出现分段错误
【发布时间】:2017-06-01 23:37:19
【问题描述】:

这个小代码 sn-p 使用 g++ 6.2.0 和 clang++ 3.8.1 出现段错误:

clang++ -std=c++11 -O3 -mavx -pthreadg++ -std=c++11 -O3 -mavx -pthread

#include <thread>
#include <iostream>

class alignas(32) AlignedObject {
public:
  float dummy[8];
};

int main() {
  while (true) {
    std::thread([](){
      AlignedObject x;
      std::cout << &x;
      std::thread([x](){
        std::cout << &x;
      }).join();
    }).join();
  }

  return 0;
}

查看反汇编,两个编译器都插入了失败的vmovaps 指令,这表明编译器生成的对象在某处没有正确对齐。如果 -mavx 被删除,它会正常工作,因为该指令不再被使用。这是编译器错误还是此代码依赖于未定义的行为?

【问题讨论】:

    标签: c++ c++11 lambda memory-alignment avx


    【解决方案1】:

    诸如alignas(n)__attribute__((aligned(n))) 之类的对齐说明符仅适用于具有自动存储类的变量。然而,std::function(由 lambda 使用)被允许(有时需要)动态分配函数闭包,在这种情况下,对齐说明符将被忽略,并且只保证到 std::max_align_t 的对齐。

    总之,除了将您自己的自定义分配器传递给底层std::function 之外,具有扩展对齐 要求的对象无法通过 lambda 中的值安全地捕获,而必须通过引用来捕获。 (我想这更多是 std::bind 的属性,而不是 lambdas)。

    【讨论】:

      猜你喜欢
      • 2012-03-21
      • 2020-02-17
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      • 2020-10-18
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多