摘要:
我正在寻找最快的计算方法
(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位.
鉴于此声明(作为旁注,不是我首选的编码风格)
if( doSomething() ) {}
Run Code Online (Sandbox Code Playgroud)
"C++标准"是否保证调用该函数?(它的返回值对执行路径没有影响,因此编译器可以遵循快捷方式评估的思想并对其进行优化.)
我调试了一个相当复杂的程序,有很多队列,每个队列都有一个相对较短的超时时间。我无法在 gdb 的“手动”命令行模式下进行可靠的调试,因为当我缓慢键入命令时会触发超时。
我不喜欢延长所有队列超时的想法,因为这会让事情变得非常混乱。(这听起来像设计本身是有争议的,我知道......)
我真的很想使用 gdb 的“脚本”功能,但我还没有找到一个很好的教程。
谁能告诉我这在 gdb“命令文件”脚本中是否可行:
所以基本上我的问题是:我可以等待 gdb 命令文件脚本中的断点吗?
我试图从系统集成商的角度了解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兼容的绝大多数应用程序。如果存在诸如长期不推荐使用的兼容性填充之类的极端情况,我现在暂时将其忽略。
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)
在被调用函数内部,两个参数都是指向同一地址的指针。
看一个像这样的简单模板场景:
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并且只在它被激活时激活某些代码行.我想有一些更多嵌套模板调用的解决方案,但对我来说最好只保留一个功能.
我的问题是关于参数包和相关元组.如何创建与参数包相同大小的元组,但是使用单个独立类型?
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时,当我解决问题时,事情会变得非常容易:
我有一个类型/对象列表,由参数包表示.这将主元组定义为类成员.现在我想要为这些类型/对象中的每一个存储在附加元组中的附加信息.不要那样做.这个结构可以(几乎)总是被单个元组替换,包含例如具有所有元素的结构,否则这些元素分布在多个元组中.