相关疑难解决方法(0)

Linux内核中可能/不太可能的宏如何工作以及它们的好处是什么?

我一直在挖掘Linux内核的某些部分,发现这样的调用:

if (unlikely(fd < 0))
{
    /* Do something */
}
Run Code Online (Sandbox Code Playgroud)

要么

if (likely(!err))
{
    /* Do something */
}
Run Code Online (Sandbox Code Playgroud)

我找到了它们的定义:

#define likely(x)       __builtin_expect((x),1)
#define unlikely(x)     __builtin_expect((x),0)
Run Code Online (Sandbox Code Playgroud)

我知道它们是为了优化,但它们是如何工作的?使用它们可以预期性能/尺寸减少多少?至少在瓶颈代码中(当然在用户空间中)是否值得麻烦(并且可能失去可移植性).

linux gcc linux-kernel likely-unlikely

331
推荐指数
6
解决办法
13万
查看次数

我是否应该认为声明所有C静态函数是一个很好的实践?

我最近写了一段像这样的C代码:

static void func1()
{

}

static void func2()
{

}


typedef void (*func_t)(void);

const func_t lookUpTable[FUNC_COUNT] =
{
    [FUNC1] = &func1,
    [FUNC2] = &func2
}
Run Code Online (Sandbox Code Playgroud)

另一个程序员在同一个文件上工作并将其更改为:

static void func1();
static void func2();

typedef void (*func_t)(void);

const func_t lookUpTable[FUNC_COUNT] =
{
    [FUNC1] = &func1,
    [FUNC2] = &func2
}

static void func1()
{

}

static void func2()
{

}
Run Code Online (Sandbox Code Playgroud)

由于funcN函数只通过查询表调用,我实际上并不需要这些函数的声明.

这是一个品味问题,还是一种被认为是好/坏做法的编码风格?

谢谢你的回答!

c declaration lookup-tables

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

哪种虚拟机的调度方法更有效?

哪种更有效的调度方法可以使我的fetch-decode-execute次数更快一点?

为简单起见,我将其保持在最低限度,就像操作在1字节操作数上操作一样,例如只有两个操作数.

我现在使用的方法(简化)是:

typedef unsigned char byte;

vector<byte> _program = { INST::PUSH, 32, INST::POP};

enum INST {
    PUSH =0, /*index=0*/
    POP =1, /*index=1*/
}

//DISPATCHING METHOD #1
switch (curr_instruction) {
    case INST::PUSH: {
        /*declared inline*/ _push_to_stack(_program[instr_ptr+1]);
    }
    case INST::POP: {
        /*declared inline*/ _pop_stack();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者使用函数指针表来执行'program'中的每条指令(vector/vector _program),如下所示:

typedef void (*voidptr)();

void hndl_push(){
    /*declared inline*/ _push_to_stack(_program[instr_ptr+1]);
}
void hndl_push(){
    /*declared inline*/ _pop_stack();
}

funcptr handlers[2] = {&hndl_push /*index=0*/, & hdnl_pop /*index=1*/}'
vector<byte> _program = { INST::PUSH, 32, INST::POP};

size_t …
Run Code Online (Sandbox Code Playgroud)

c++ performance assembly compiler-optimization vm-implementation

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

可以使用函数指针数组来删除分支

函数指针数组是否能够通过删除分支来提高性能?

(function[number])();
Run Code Online (Sandbox Code Playgroud)

比...快

if(number == 0)
    function1();
else if (number == 1)
    function2();
Run Code Online (Sandbox Code Playgroud)

为了表现?(假设这是非常性能关键的代码)

编辑:数字是0或1(否则使用,因为它应该只有0或1)

c++ optimization function-pointers

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

事件是SFML.切换语句VS if语句

我有一些像这样的代码:

while(window.pollEvent(event) {
    //checking events...
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,我应该使用switch语句:

switch(event.type) {
    case sf::Event::Closed:
        window.close();
        break;
    case sf::Event::KeyPressed:
        //...
        break;
}
Run Code Online (Sandbox Code Playgroud)

或if-else声明:

if(event.type == sf::Event::Closed)
    window.close();
else if(event.type == sf::Event::KeyPressed)
    //...
Run Code Online (Sandbox Code Playgroud)

在SFML中哪个更快,而在其他方面更具可读性?

c++ if-statement switch-statement

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