小编i_w*_*arn的帖子

g ++ c ++ 11 constexpr评估性能

g ++(4.7.2)和类似版本似乎在编译期间以惊人的速度评估constexpr.事实上在我的机器上比运行时编译的程序快得多.

这种行为有合理的解释吗?是否存在仅在编译时适用的优化技术,可以比实际编译的代码更快地执行?如果是这样,哪个?

这是我的测试程序和观察结果.

#include <iostream>

constexpr int mc91(int n)
 {

     return (n > 100)? n-10 : mc91(mc91(n+11));

 }

constexpr double foo(double n)
{
   return (n>2)? (0.9999)*((unsigned int)(foo(n-1)+foo(n-2))%100):1;
}

constexpr unsigned ack( unsigned m, unsigned n )
{
    return m == 0
        ? n + 1
        : n == 0
        ? ack( m - 1, 1 )
        : ack( m - 1, ack( m, n - 1 ) );
}

constexpr unsigned slow91(int n) {
   return mc91(mc91(foo(n))%100);
}

int main(void) …
Run Code Online (Sandbox Code Playgroud)

c++ constexpr

13
推荐指数
2
解决办法
1527
查看次数

char数组上的C/C++开关案例

我有几个数据结构,每个数据结构有4个字节的字段.

由于int我的平台上4个字节等于1 ,我想在case标签中使用它们:

switch (* ((int*) &structure->id)) {
   case (* ((int*) "sqrt")): printf("its a sqrt!"); break;
   case (* ((int*) "log2")): printf("its a log2!"); break;
   case (((int) 'A')<<8 + (int) 'B'): printf("works somehow, but unreadable"); break;
   default: printf("unknown id");
}
Run Code Online (Sandbox Code Playgroud)

这会导致编译错误,告诉我case表达式不会减少到int.

我如何使用有限大小的char数组,并将它们转换为数值类型以用于switch/ case

c arrays casting switch-statement

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

正确导出Linux标头,模块

在树中构建内核驱动程序时,我在drivers目录中运行make,这里KERNELDIR是内核源代码的路径,或者是头文件.

make -C $(KERNELDIR) M=$(PWD) modules
Run Code Online (Sandbox Code Playgroud)

在尝试使用以下方法构建标头时:

make headers_install ARCH=i386 INSTALL_HDR_PATH=$(HEADERSDIR)
Run Code Online (Sandbox Code Playgroud)

我觉得不适合出口建立一个反模块(不完整的内核源代码树)的几个文件和文件夹似乎丢失,就像一个Makefile文件,脚本,include/generated/autoconf.hinclude/config/auto.conf

Debian以一种可用的方式处理事务,如rules.real中所描述的那样,尽管它的描述不仅仅是描述的Documentation/make/headers_install.txt,似乎不是"标准"方式.

简而言之:我如何正确导出linux头文件,以便我可以针对它构建外部模块?

linux kernel module header

7
推荐指数
2
解决办法
4718
查看次数

标签 统计

arrays ×1

c ×1

c++ ×1

casting ×1

constexpr ×1

header ×1

kernel ×1

linux ×1

module ×1

switch-statement ×1