C++专题之Attribute(未完待续)
本文最后更新于 1060 天前,其中的信息可能已经有所发展或是发生改变。

在C++11特性整理一文中对属性有粗略介绍[链接],此文会各属性作补充说明;

本文主要的数据来源:[来源1][来源2];如有其它来源另做标示;

1.[[noreturn]]

含义:指示函数不返回;

[[ noreturn ]] void f() {
  throw "error";
  // OK
}
 
void q [[ noreturn ]] (int i) {
  // 若以 <= 0 的参数调用则行为未定义
  if (i > 0) {
    throw "positive";
  }
}
 
// void h() [[noreturn]]; // 错误:属性应用到 h 的函数类型,而非 h 自身

需要注意的时,返回值为void的函数并不代表不返回,只表示没有返回值,针对函数q,当i<=0时依旧会产生返回行为,会产生warning,可能会导致程序崩溃;

2.[[carries_dependency]]

含义:指示释放消费 std::memory_order 中的依赖链传入和传出该函数;

  • 它可应用于函数或 lambda 表达式的形参声明,该情况下它指示从该形参的初始化向该对象的左值到右值转换中携带依赖。
  • 它可应用于函数声明整体,该情况下它指示从返回值向函数调用表达式的求值中携带依赖。
std::atomic<int *> p;
std::atomic<int *> q;

void func1(int *val)
{ std::cout << *val << std::endl; }

void func2(int * [[carries_dependency]] val)
{ q.store(val, std::memory_order_release);
std::cout << *q << std::endl; }

void thread_job()
{
    int *ptr1 = (int *)p.load(std::memory_order_consume); // 1
    std::cout << *ptr1 << std::endl; // 2
    
    func1(ptr1); // 3
    func2(ptr1); // 4
}

在注释1处,ptr1使用了memory_order_consume的内存策略(感觉memory_order_consume也得专门介绍),func1访问了ptr1,编译器会在func1被调用之前构建一个内存栅栏,如果这个线程被大量的调用,这个额外的内存栅栏将导致性能损失;在func2中使用了[[carries_dependency]]属性,那么同样的访问ptr1,编译器就知道程序已经处理好了相关的内存访问限制,那么在func2之前,编译器就无需再插入额外的内存栅栏,提高了效率;

有点晕,好多基础知识没掌握)

针对内存语义,可见这篇的32(多线程内存模型)[链接];

3.[[deprecated]] 和 [[deprecated(“reason”)]]

上一篇
下一篇