相关疑难解决方法(0)

reinterpret_cast创建一个简单的默认构造对象

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)

以下是三个问题:

  1. 这个引用是否正确?
  2. 如果是,那么X开始的生命周期是什么时候?如果在线(B),它是否被视为获取存储?如果在线(A),如果有一个分支(A)(B)有条件地构建一个X或其他一些pod,Y怎么办?
  3. 在这方面,C++ 11和C++ 1z之间有什么变化吗?

请注意,这是一个旧链接.针对这个问题,措辞发生了变化.它现在写道:

但是,与C不同,通过简单地重新解释适当对齐的存储来创建具有普通默认构造函数的对象,例如分配的内存std::malloc:placement-new是正式引入新对象并避免潜在的未定义行为所必需的.

c++ language-lawyer c++11 c++17

51
推荐指数
2
解决办法
1812
查看次数

如何确定内存是否对齐?

我是使用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代码慢).

先感谢您...

c memory optimization sse simd

40
推荐指数
6
解决办法
4万
查看次数

如何使用SFINAE检测一个类的存在?

是否可以使用SFINAE检测C++中是否存在类?如果可能的话怎么样?

假设我们有一个只由某些版本的库提供的类.我想知道是否可以使用SFINAE来检测该类是否存在.检测结果是任意的,比如枚举常数,如果存在,则为1,否则为0.

c++ templates sfinae

27
推荐指数
3
解决办法
7935
查看次数

格式错误,无需诊断(NDR):C ++ 14中抛出了ConstExpr函数

#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)。

  • 此代码正确(标准中有错误)还是不正确(Clang和GCC中都存在错误)?

我还发现了有关标准措辞的这些有趣的讨论:

一个/该程序是否可能“ 格式错误,不需要诊断 ”,并且允许编译器成功编译该程序?

c++ throw constexpr c++14

3
推荐指数
1
解决办法
640
查看次数

标签 统计

c++ ×3

c ×1

c++11 ×1

c++14 ×1

c++17 ×1

constexpr ×1

language-lawyer ×1

memory ×1

optimization ×1

sfinae ×1

simd ×1

sse ×1

templates ×1

throw ×1