小编phi*_*ipp的帖子

无论结果是什么,支持除零的最快整数除法是什么?

摘要:

我正在寻找最快的计算方法

(int) x / (int) y
Run Code Online (Sandbox Code Playgroud)

没有得到例外y==0.相反,我只想要一个任意的结果.


背景:

在编码图像处理算法时,我经常需要除以(累积的)α值.最简单的变体是带有整数运算的普通C代码.我的问题是,我通常得到结果像素的零误差除法alpha==0.然而,这正是结果无关紧要的像素:我不关心像素的颜色值alpha==0.


细节:

我正在寻找类似的东西:

result = (y==0)? 0 : x/y;
Run Code Online (Sandbox Code Playgroud)

要么

result = x / MAX( y, 1 );
Run Code Online (Sandbox Code Playgroud)

x和y是正整数.代码在嵌套循环中执行了很多次,所以我正在寻找一种摆脱条件分支的方法.

当y不超过字节范围时,我对解决方案感到满意

unsigned char kill_zero_table[256] = { 1, 1, 2, 3, 4, 5, 6, 7, [...] 255 };
[...]
result = x / kill_zero_table[y];
Run Code Online (Sandbox Code Playgroud)

但这显然不适用于更大的范围.

我想最后一个问题是:什么是最快的位,将hack改为0到任何其他整数值,同时保持所有其他值不变?


澄清

我不是100%确定分支太贵了.但是,使用了不同的编译器,所以我更喜欢基准测试而几乎没有优化(这确实值得怀疑).

当然,编译器很有用,但是我不能在C中表达"不关心"的结果,因此编译器永远无法使用全范围的优化.

代码应完全兼容C,主要平台是带有gcc&clang和MacOS的Linux 64位.

c c++ optimization divide-by-zero

109
推荐指数
3
解决办法
6221
查看次数

If-C++中带有空体的语句:是否保证要评估条件?

鉴于此声明(作为旁注,不是我首选的编码风格)

if( doSomething() ) {}
Run Code Online (Sandbox Code Playgroud)

"C++标准"是否保证调用该函数?(它的返回值对执行路径没有影响,因此编译器可以遵循快捷方式评估的思想并对其进行优化.)

c++

8
推荐指数
1
解决办法
1108
查看次数

gdb 命令文件脚本:等待断点支持?

我调试了一个相当复杂的程序,有很多队列,每个队列都有一个相对较短的超时时间。我无法在 gdb 的“手动”命令行模式下进行可靠的调试,因为当我缓慢键入命令时会触发超时。

我不喜欢延长所有队列超时的想法,因为这会让事情变得非常混乱。(这听起来像设计本身是有争议的,我知道......)

我真的很想使用 gdb 的“脚本”功能,但我还没有找到一个很好的教程。

谁能告诉我这在 gdb“命令文件”脚本中是否可行:

  • 初始化一些东西(简单)
  • 设置断点
  • 运行程序
  • 一旦断点被​​命中,就执行脚本中的下一个命令

所以基本上我的问题是:我可以等待 gdb 命令文件脚本中的断点吗?

scripting gdb

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

AOSP / Android 7:如何详细利用EGL?

我试图从系统集成商的角度了解Android(7)图形系统。我的主要重点是libegl需要提供的最低功能。

我了解Surfaceflinger是该领域的主要参与者。Surfaceflinger初始化了EGL,创建了实际的EGL表面,并充当了该应用程序创建的缓冲区(框架)的使用者。该应用程序再次执行所需的GLES调用的主要部分。显然,这会导致限制,因为Surfaceflinger和应用程序处于单独的流程中,这不是GLES / EGL的典型用例。

我不明白的事情:

  • Android 7上的应用程序是否始终渲染到发送到surfaceflinger的EGL_KHR_image缓冲区中?据我所知,这意味着总是会有一个额外的复制步骤(即使不需要合成时也是如此)……或者还有某种优化的全屏模式,其中应用程序确实可以直接渲染到最终的EGL曲面中?

  • 这里使用哪些进程间共享机制?我的猜测是,与EGL_NATIVE_BUFFER_ANDROID一起使用的EGL_KHR_image定义了确切的二进制格式,因此可以在每个进程中创建一个图像对象,在该过程中,内存通过ashmem共享。这已经是完整/正确的图片了吗,还是我在这里错过了什么?

我想这些是我目前缺乏自信的要点。当然,我对此有一些后续问题(例如,gralloc / composition如何适合此问题?),但是根据该平台,我希望将此问题保持尽可能的紧凑。尽管如此,除了主文档页面之外,我仍然缺少针对系统集成商的文档。因此,进一步的链接将不胜感激。

我目前的重点是典型的用例,这些用例将涵盖与Android 7兼容的绝大多数应用程序。如果存在诸如长期不推荐使用的兼容性填充之类的极端情况,我现在暂时将其忽略。

android android-source surfaceflinger

5
推荐指数
0
解决办法
128
查看次数

qPrintable 是否容易出现访问冲突?

qPrintable的定义:

#  define qPrintable(string) QString(string).toLocal8Bit().constData()
Run Code Online (Sandbox Code Playgroud)

toLocal8Bit 返回一个 QByteArray。QByteArray::constData()的文档:

只要字节数组没有被重新分配或销毁,指针就保持有效。

toLocal8Bit() 创建一个临时 QByteArray,该临时 QByteArray 在调用 constData() 后立即被销毁。所以constData返回的指针指向已释放的内存。

我在这里错过了什么吗?

附加评论:qPrintable的文档说明了这一点:

在使用 qPrintable() 的语句之后,char 指针将无效。这是因为 QString::toLocal8Bit() 返回的数组将超出范围。

但是,这是什么意思?根据我的理解,这与“指针从 qPrintable 返回时起就无效”相同

我为什么要问:

我见过代码失败,可​​以像这样简化:

someFunction( stringA.toLatin1().constData(), stringB.toLatin1().constData())
Run Code Online (Sandbox Code Playgroud)

在被调用函数内部,两个参数都是指向同一地址的指针。

c++ qt

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

如何在C++ 11模板中定义时调用它

看一个像这样的简单模板场景:

class A {
    public:
        int work();
};

class B {
    public:
        int work();
};

class ObjectManager {
    public:
        static void manage( A& obj );
        // manage not defined for class B 
};

template<class T>
doStuff( T t ) {
    t.work();
    ....
    ObjectManager::manage(t);
};


A a;
B b;

doStuf(a);
doStuff(b);
Run Code Online (Sandbox Code Playgroud)

我想知道,实现条件调用的最简洁方法是什么ObjectManager::manage?模板函数应该在编译时确定ObjectManager::manage(T t)是否为给定定义,T并且只在它被激活时激活某些代码行.我想有一些更多嵌套模板调用的解决方案,但对我来说最好只保留一个功能.

c++ c++11

2
推荐指数
1
解决办法
135
查看次数

模板参数包:如何创建具有相同长度的独立类型的元组

我的问题是关于参数包和相关元组.如何创建与参数包相同大小的元组,但是使用单个独立类型?

template <class... T>
class Thing {
  public:
    // some struct that was found helpful for any Type used as parameter
    struct HelperData{ 
      int a; 
      int b; 
    };

    [...]

  private:
    // the tuple used as normally, my initial reason to use parameter pack
    std::tuple<T...> m_tuple;

    // now I want a tuple of N values of type HelperData, where N is sizeof...(T)
    std::tuple<HelperData...sizeof...(T)> m_helperData; //???
};
Run Code Online (Sandbox Code Playgroud)

回顾性评论:

这个问题可能在技术上有效并且有很好的答案.但是潜在的概念提出了越来越多的问题(如何一次迭代多个容器等).使用C++ 14或更新版本可能是正确的选择,但是,我发现使用C++ 11时,当我解决问题时,事情会变得非常容易:

我有一个类型/对象列表,由参数包表示.这将主元组定义为类成员.现在我想要为这些类型/对象中的每一个存储在附加元组中的附加信息.不要那样做.这个结构可以(几乎)总是被单个元组替换,包含例如具有所有元素的结构,否则这些元素分布在多个元组中.

c++ templates variadic-templates c++11 stdtuple

2
推荐指数
1
解决办法
95
查看次数