cppreference †声明:
具有普通默认构造函数的对象可以通过
reinterpret_cast在任何适当对齐的存储上使用来创建,例如在分配有的存储器上std::malloc.
这意味着以下是明确定义的代码:
struct X { int x; };
alignas(X) char buffer[sizeof(X)]; // (A)
reinterpret_cast<X*>(buffer)->x = 42; // (B)
Run Code Online (Sandbox Code Playgroud)
以下是三个问题:
X开始的生命周期是什么时候?如果在线(B),它是否被视为获取存储?如果在线(A),如果有一个分支(A)和(B)有条件地构建一个X或其他一些pod,Y怎么办?†请注意,这是一个旧链接.针对这个问题,措辞发生了变化.它现在写道:
但是,与C不同,通过简单地重新解释适当对齐的存储来创建具有普通默认构造函数的对象,例如分配的内存
std::malloc:placement-new是正式引入新对象并避免潜在的未定义行为所必需的.
我是使用SSE/SSE2指令优化代码的新手,直到现在我还没有走得太远.据我所知,一个常见的SSE优化函数如下所示:
void sse_func(const float* const ptr, int len){
if( ptr is aligned )
{
for( ... ){
// unroll loop by 4 or 2 elements
}
for( ....){
// handle the rest
// (non-optimized code)
}
} else {
for( ....){
// regular C code to handle non-aligned memory
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如何正确确定内存ptr点是否与16字节对齐?我认为我必须包含非对齐内存的常规C代码路径,因为我无法确保传递给此函数的每个内存都将对齐.使用内在函数将数据从未对齐的内存加载到SSE寄存器似乎非常慢(甚至比常规C代码慢).
先感谢您...
是否可以使用SFINAE检测C++中是否存在类?如果可能的话怎么样?
假设我们有一个只由某些版本的库提供的类.我想知道是否可以使用SFINAE来检测该类是否存在.检测结果是任意的,比如枚举常数,如果存在,则为1,否则为0.
#include <iostream>
using namespace std;
constexpr int f(bool b){ return b ? throw 0 : 0; } // OK
constexpr int f() { return f(true); } // Ill-Formed, No Diagnostic Required
int main(){
try{
f();
}catch( int x ){
cout << "x = " << x << endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该代码是C ++ 14标准(ISO / IEC 14882:2014)第7.1.5节第5段的示例:
对于非模板,非默认constexpr函数或非模板,非默认,非继承constexpr构造函数,如果不存在参数值,则该函数或构造函数的调用可以是核心常量的评估子表达式表达式(5.19),程序格式错误;无需诊断。
它被描述为“ 格式错误,不需要诊断 ”,因为throw-expression不是核心常量表达式(5.19 / 2)。但是,Clang和GCC都可以成功编译它(Ideone)。
我还发现了有关标准措辞的这些有趣的讨论:
一个/该程序是否可能“ 格式错误,不需要诊断 ”,并且允许编译器成功编译该程序?