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) 我有几个数据结构,每个数据结构有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?
在树中构建内核驱动程序时,我在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.h或include/config/auto.conf等
Debian以一种可用的方式处理事务,如rules.real中所描述的那样,尽管它的描述不仅仅是描述的Documentation/make/headers_install.txt,似乎不是"标准"方式.
简而言之:我如何正确导出linux头文件,以便我可以针对它构建外部模块?