小编Sha*_*ggi的帖子

在联合中访问相同类型的非活动成员

我有这样的事情:

union DataXYZ
{
    struct complex_t
    {
        float real, imag;
    } complex;

    struct vector_t
    {
        float magnitude, phase;
    } vector;
};
Run Code Online (Sandbox Code Playgroud)

我有一些这些的向量,是通用工作区内存,我在语义上下文后相应地使用字段.

我知道,当最后一个活动成员是另一个字段(并且键入?)时,读取联合中的字段是未定义的行为.类型和布局完全匹配时,这是否重要?

我一直在评论其他一些类似的问题,要求提供保证行为的参考资料,但还没有出现 - 因此这个问题.

c++ undefined-behavior unions

15
推荐指数
1
解决办法
578
查看次数

std :: fabs()的优化不好?

最近我正在使用一个类似于以下代码的应用程序:

for (auto x = 0; x < width - 1 - left; ++x)
{
    // store / reset points
    temp = hPoint = 0;
    for(int channel = 0; channel < audioData.size(); channel++)
    {
        if (peakmode) /* fir rms of window size */
        {
            for (int z = 0; z < sizeFactor; z++)
            {
                temp += audioData[channel][x * sizeFactor + z + offset];
            }
            hPoint += temp / sizeFactor;
        }
        else /* highest sample in window */
        {
            for (int …
Run Code Online (Sandbox Code Playgroud)

c++ bit-manipulation

12
推荐指数
1
解决办法
1452
查看次数

基于运行时参数执行整数模板化函数

我经常有一些基于某种设计方法生成输出的原型行为.我模板化设计方法,它提供了我需要的许多功能.但是,有时设计方法是在运行时给出的,所以我通常需要编写一个巨大的switch语句.它通常看起来像这样:

enum class Operation
{
    A, B
};


template<Operation O>
    void execute();

template<>
    void execute<A>()
    {
        // ...
    }

template<>
    void execute<B>()
    {
        // ...
    }

void execute(Operation o)
{
    switch (o)
    {
    case Operation::A: return execute<Operation::A>();
    case Operation::B: return execute<Operation::B>();
    }
}
Run Code Online (Sandbox Code Playgroud)

我很好奇是否有人为这个系统找到了一个很好的模式 - 这个方法的主要缺点是必须输出所有支持的枚举,并且如果实现了新的枚举,则需要维护几个地方.

e:我应该补充说,弄乱编译时模板的原因是允许编译器在HPC中内联方法以及继承constexpr属性.

e2:实际上,我想我要问的是让编译器使用隐式开关结构生成所有可能的代码路径.也许一些递归模板魔术?

c++ metaprogramming switch-statement

7
推荐指数
1
解决办法
119
查看次数

将向量的特定元素广播到另一个向量

如何从 __m256 向量中的索引中提取单个浮点,并将其广播到结果向量?

伪代码:

__m256 input = { 2, 3, 4, 5, 6, 7, 8, 9 };
__m256 output = __mm256_selectidx(input, 2);

// output [0 .. 7] now consists of input[2], that is, {4, 4, 4, 4, 4, 4, 4, 4}
Run Code Online (Sandbox Code Playgroud)

相关功能似乎是提取/插入或排列,但文档很少/我不太理解。广播系列看起来也不错,但只适用于内存操作数?

c++ sse simd avx

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

浮点范围缩小

我正在使用Mono在C#中实现一些32位浮点三角函数,希望使用Mono.Simd.我目前只缺少固体范围减少.我现在很困惑,因为Mono的SIMD扩展显然不包括浮点数和整数之间的转换,这意味着我无法进行舍入/截断,这是常用的方法.然而,我可以在int和float之间按位转换.

可以这样做吗?如果需要,我可以上下调整域,但理想情况下,范围减少应该导致域[0,2 pi]或[-pi,pi].我有一种预感,如果域名是2的幂,就可以用指数做一些IEEE魔法,但我真的不知道该怎么做.

编辑:好的,我已经尝试搞乱这个C代码,感觉就像我正处于某种边缘(它不起作用,但小数部分始终是正确的,至少在十进制/ base10中......) .核心原则似乎是获得你的域和输入指数之间的指数差异,并组成一个带有移位尾数和调整指数的新浮点数.但它不适用于负数,我不知道如何处理非幂2(或任何分数 - 事实上,除2以外的任何东西都不起作用!).

// here's another more correct attempt:
float fmodulus(float val, int domain)
{
    const int mantissaMask = 0x7FFFFF;
    const int exponentMask = 0x7F800000;

    int ival = *(int*)&val;

    int mantissa = ival & mantissaMask;
    int rawExponent = ival & exponentMask;
    int exponent = (rawExponent >> 23) - (129 - domain);
    // powers over one:
    int p = exponent;

    mantissa <<= p;
    rawExponent = exponent >> p;
    rawExponent += 127;
    rawExponent <<= 23; …
Run Code Online (Sandbox Code Playgroud)

c# mono sse simd ieee-754

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

在free/malloc,外部内存挂钩上花费了多少时间?

这部分是编程/调试相关的,部分是与外部操作系统相关的(超级用户候选人?),但无论如何我都在这里发布,因为如果有人应该知道答案,那就在这里.

我突然开发了一个程序,一个新版本(没有重大变化)导致一切都停止了.我对它进行了分析,看看花了多少时间,但%分布是正常的 - 所有事情都花了很长时间.

使用Very Sleepy通过callstack进行研磨,我注意到free/malloc/delete/realloc占运行时的95%以上.怀疑堆损坏,我回滚了所有更改,但没有任何改变.

使用MSVC的分析器,我挖出了调用堆栈,超出了malloc/realloc,并且令人惊讶地 - 在一个名为Acxtrnal.dll的外部dll上结束了.这是一个堆栈的剪辑:http://i.imgur.com/0xXv5MV.png

显然,一些外部dll正在挂钩我的程序的堆验证程序.这让我有点焦虑.谷歌搜索dll只显示其中的一个官方来源(关于兼容性模式;不相关):https://support.microsoft.com/en-us/kb/2272691

在难以置信地花了半天调试后,问题就消失了.看起来这个人有同样的问题,虽然'答案'可能是无关的:在分析我的fortran程序时,Acxtrnal.dll是使用大部分CPU时间的部分!那是什么dll.

当然,现在,我既好奇又担心这个问题; 它是否会回归 - 为什么它会在第一种情况下发生?如果有人经历过类似的事情,我将不胜感激,因此我们可以阐明这个问题.即使这个问题看起来很少见,也许它会帮助那些人.

c++ windows memory-management

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

与父进程分离子进程

当从父进程派生的子进程死亡时,它在某种程度上仍然存在并处于僵尸状态,直到从wait()调用中获得该进程为止。

是否可以解除这种亲子关系并让孩子自动获得收成?也许让孩子成为孩子的孤儿,或者其他什么?

可能的用例:在一个长期存在的程序中创建许多“抛弃式”进程,而无需“保留”越来越多的无法由OS回收的僵尸PID。

unix posix child-process

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