Dav*_*one 5 c++ gcc constructor clang
以下属性注释有效吗?
\nstruct s {\n [[gnu::pure]] s(): m(1) {}\n int m;\n};\n
Run Code Online (Sandbox Code Playgroud)\nhttps://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html关于属性的说明pure
:
\n\n调用除了返回值之外对程序状态没有明显影响的函数可能有助于优化,例如公共子表达式消除。使用 pure 属性声明此类函数可以让 GCC 避免在使用相同参数值重复调用函数时发出某些调用。
\npure 属性禁止函数修改可通过检查函数 xe2x80x99s 返回值以外的方式观察的程序状态。但是,使用 pure 属性声明的函数可以安全地读取任何非易失性对象,并以不影响其返回值或程序的可观察状态的方式修改对象的值。
\n例如,
\nint hash(char *)属性((pure));
\n告诉 GCC,如果通过 hash 可观察到的程序状态(包括数组本身的内容)在中间不发生变化,则使用相同字符串对函数 hash 的后续调用可以替换为第一次调用的结果。即使 hash 采用\n非常量指针参数,它也不能修改它指向的数组,\n也不能修改程序其余部分可能依赖其值的任何其他对象。\n但是,调用者可以安全地更改数组的内容\n在连续调用该函数之间(这样做会禁用\n优化)。该限制也适用于 C++ 非静态成员函数中 this 指针引用的成员对象。
\n纯函数的一些常见示例是 strlen 或 memcmp。\n有趣的非纯函数是具有无限循环的函数或\n依赖于易失性内存或其他系统资源的函数,\n这些函数可能在连续调用之间发生变化(例如标准 C feof 函数\在多线程环境中)。
\npure 属性对函数\xe2\x80\x99s 定义施加了与 const 属性相似但更宽松的限制:pure 允许函数读取任何非易失性内存,即使它在函数的连续调用之间\n发生变化。诊断使用 pure 和 const 属性声明同一个函数。\n因为纯函数不能有任何可观察到的副作用,所以这样的函数返回 void 是没有意义的。声明这样的\n功能已被诊断。
\n
它如何与 C++ 构造函数交互?如果您将构造函数视为返回该类型值的函数(以类型命名),则s
可以安全地标记 的默认构造函数pure
。如果您将构造函数视为一个成员函数,它获取this
传入的隐藏指针,然后写入该内存,那么s
无法标记 的默认构造函数pure
。