小编Yar*_*Tal的帖子

在C++中,我是否应该费心缓存变量,还是让编译器进行优化?(混叠)

请考虑以下代码(p属于类型unsigned char*bitmap->width属于某种整数类型,具体哪个是未知的,取决于我们正在使用的某个外部库的版本):

for (unsigned x = 0;  x < static_cast<unsigned>(bitmap->width);  ++x)
{
    *p++ = 0xAA;
    *p++ = 0xBB;
    *p++ = 0xCC;
}
Run Code Online (Sandbox Code Playgroud)

值得优化它[...]

可能存在这样一种情况,即通过编写可以产生更有效的结果:

unsigned width(static_cast<unsigned>(bitmap->width));
for (unsigned x = 0;  x < width;  ++x)
{
    *p++ = 0xAA;
    *p++ = 0xBB;
    *p++ = 0xCC;
}
Run Code Online (Sandbox Code Playgroud)

...或者编译器优化是否微不足道?

您认为什么是"更好"的代码?

编辑(Ike)的注意事项:对于那些对三角形文本感到疑惑的人来说,原来的问题,如同措辞一样,非常接近于偏离主题的领域,并且尽管有积极的反馈,但非常接近于被关闭.这些已经被打乱了.但是,请不要惩罚那些解决这些问题的受影响部分的回答者.

c++ optimization performance caching strict-aliasing

114
推荐指数
9
解决办法
7276
查看次数

使用Qt触摸linux中的事件

我正在尝试使用Qt在linux中编写触摸事件.我的触摸屏工作,但是当我触摸屏幕时,我得到鼠标事件而不是触摸事件.鼠标光标移动到我触摸屏幕的位置.如果这是Qt问题或在操作系统级别发生的事情,我不知道.

我在Debian Jessie上使用Qt 5.4.0.

linux qt touch

16
推荐指数
1
解决办法
2191
查看次数

如何使用Xlib恢复窗口?

我已经设法使用了一个窗口图标XIconifyWindow,但是还没有设法恢复它.我尝试了以下方法:

XMapRaised (display, window);
Run Code Online (Sandbox Code Playgroud)

和:

XMapWindow (display, window);
Run Code Online (Sandbox Code Playgroud)

和:

XClientMessageEvent ev;
std::memset (&ev, 0, sizeof ev);
ev.type = ClientMessage;
ev.window = window;
ev.message_type = XInternAtom(display, "WM_CHANGE_STATE", False);
ev.format = 32;
ev.data.l[0] = NormalState;
XSendEvent (display, RootWindow(display, XDefaultScreen(display)), False,
  SubstructureRedirectMask |SubstructureNotifyMask, (XEvent*)&ev);
XFlush (display);
Run Code Online (Sandbox Code Playgroud)

没有成功.我正在使用Debian Jessie和GNOME 3.14.0.

unix linux x11 gnome xlib

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

在 Linux/C++ 中,发送到线程/进程的信号是否会使其变为活动状态?

在Linux中,当信号被发送到进程/线程(无论出于何种原因)时,是否立即调用信号处理程序(假设有一个,并且信号没有被阻止)?

我的意思是,我很确定在处理信号的进程/线程中它将立即被调用,但我的意思是相对于其他进程/线程。

如果立即调用处理程序,它是否也会使相应的进程/线程处于活动状态(以便其正常执行立即继续)?

编辑

由于我原来的问题似乎被误解了,我将尝试用一个例子再次解释。

假设我的计算机有一个 CPU,正在运行 2 个进程,进程“A”和进程“B”。并假设它们都没有在系统调用中阻塞(如sleep)。通常,我猜,操作系统会在一小段时间后在执行进程“A”和进程“B”之间切换(例如,执行进程“A”100毫秒,然后处理“B”100毫秒,然后再次处理A 100毫秒) , ETC。)。假设进程“A”现在是活动进程(即它现在占用CPU)。现在假设进程“A”向进程“B”发送信号(或者,操作系统出于某种原因将该信号发送给进程“B”)。进程“B”已为该信号注册了一个处理程序,并且没有阻止它。所以问题是,操作系统现在会立即停止执行进程“A”并切换到执行进程“B”的信号处理程序吗?如果答案是肯定的,那么它之后会立即继续执行进程“B”(正常代码,而不是信号处理程序),还是切换回执行进程“A”,并且仅在一小段时间后恢复执行进程‘B’?

然后可以针对线程而不是进程询问相同的问题。

c c++ linux multithreading signals

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

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

在C++中,是否允许将函数指针转换为一个函数指针,该函数指针作为参数获取指向基类或派生类的指针?

以下是否会按预期工作?:

struct A {};

struct B: public A {
    int x;
    };

void f( B* o ) {
    std::cout << o->x << std::endl;
    }

int main () {
    B b;
    b.x = 5;
    reinterpret_cast<void(*)(A*)>(f)( &b );
    }
Run Code Online (Sandbox Code Playgroud)

c++ pointers casting function-pointers

4
推荐指数
2
解决办法
133
查看次数

在C++中,是否允许强制转换为仅添加非虚方法的派生类?

我想将非虚方法添加到A我无法更改的现有类中.因此,我创建了一个B继承自的类,A并添加了我想要的方法.现在,如果我有一个类型的对象A,我可以将它视为类型的对象B吗?说,以下代码合法吗?:

class A { <...> };

class B: public A {
    void f();
  };

A a();
void g( const B& );
void h() { g( static_cast<B&&>(a()) ); }
Run Code Online (Sandbox Code Playgroud)

它确实编译和工作,但我想知道标准是否能保证按预期工作.我不明白为什么不,但感觉不是很干净..

c++ oop inheritance casting

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