相关疑难解决方法(0)

我应该如何编写符合ISO C++标准的自定义新的和删除操作符?

我应该如何编写符合ISO C++标准的自定义newdelete运算符?

这是在延续重载new和delete在非常照明C++ FAQ,操作符重载,以及其后续,一个为什么要更换默认的new和delete操作?

第1部分:编写符合标准的new运算符

第2节:编写符合标准的delete运算符

(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法首先开始,所以你的答案很可能被那些提出想法的人阅读.)
注意:答案是基于Scott Meyers的学习'更有效的C++和ISO C++标准.

c++ operator-overloading c++-faq new-operator delete-operator

62
推荐指数
4
解决办法
1万
查看次数

Visual Studio 2017:_mm_load_ps经常编译为movups

我正在查看为我的代码生成的程序集(使用Visual Studio 2017),并注意到_mm_load_ps经常(总是?)编译为movups.

我正在使用_mm_load_ps的数据定义如下:

struct alignas(16) Vector {
    float v[4];
}

// often embedded in other structs like this
struct AABB {
    Vector min;
    Vector max;
    bool intersection(/* parameters */) const;
}
Run Code Online (Sandbox Code Playgroud)

现在当我使用这个结构时,会发生以下情况:

// this code
__mm128 bb_min = _mm_load_ps(min.v);

// generates this
movups  xmm4, XMMWORD PTR [r8]
Run Code Online (Sandbox Code Playgroud)

我期待movaps因为alignas(16).在这种情况下,我还需要其他东西来说服编译器使用movaps吗?

编辑:我的问题与这个问题不同,因为我没有遇到任何崩溃.结构是专门对齐的,我也使用对齐分配.相反,我很好奇为什么编译器将_mm_load_ps(对齐内存的固有内容)切换到movups.如果我知道struct是在一个对齐的地址分配的,我通过这个*调用它,那么使用movaps是安全的,对吧?

c++ assembly sse intrinsics visual-studio-2017

5
推荐指数
1
解决办法
804
查看次数

SIMD和动态内存分配

可能重复:
SSE,内在函数和对齐

我是SIMD编程的新手,所以如果我问一个明显的问题,请原谅.

我正在进行一些实验,并且想要在动态分配的结构中存储SIMD值.

这是代码:

struct SimdTest
{
    __m128      m_simdVal;

    void setZero()
    {
        __m128 tmp = _mm_setzero_ps(); 
        m_simdVal = tmp; // <<--- CRASH ---
    }
};

TEST( Plane, dynamicallyAllocatedPlane )
{
    SimdTest* test = new SimdTest();

    test->setZero();

    delete test;
}
Run Code Online (Sandbox Code Playgroud)

当执行标记为CRASH注释的方法时,代码崩溃并出现以下异常:

Unhandled exception at 0x775315de in test-core.exe: 0xC0000005: Access violation reading location 0x00000000
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么赋值操作会中断,以及如何动态分配包含SIMD的对象以使它们正常工作?

我需要补充一点,如果我静态实例化一个SimdTest对象并调用setZero方法,一切正常.

谢谢,Paksas

c++ memory-management sse simd

4
推荐指数
1
解决办法
1582
查看次数