我在我的探查器中闲逛一段时间试图弄清楚如何加速一个常见的日志解析器,这个解析器在日期解析时遇到瓶颈,我尝试了各种算法来加快速度.
我尝试过的对我来说最快的东西也是迄今为止最具可读性,但可能是非标准的C.
这在GCC,icc和我真正古老而挑剔的SGI编译器中运行良好.因为它是一个非常易读的优化,它不是我想要的吗?
static int parseMonth(const char *input) {
int rv=-1;
int inputInt=0;
int i=0;
for(i=0; i<4 && input[i]; i++) {
inputInt = (inputInt << 8) | input[i];
}
switch(inputInt) {
case 'Jan/': rv=0; break;
case 'Feb/': rv=1; break;
case 'Mar/': rv=2; break;
case 'Apr/': rv=3; break;
case 'May/': rv=4; break;
case 'Jun/': rv=5; break;
case 'Jul/': rv=6; break;
case 'Aug/': rv=7; break;
case 'Sep/': rv=8; break;
case 'Oct/': rv=9; break;
case 'Nov/': rv=10; break;
case …Run Code Online (Sandbox Code Playgroud) 我std::function指着一个函数.在这个函数内部,我将指针更改为另一个函数.
std::function<void()> fun;
void foo() {
std::cout << "foo\n";
}
void bar() {
std::cout << "bar\n";
fun = foo;
}
int main() {
fun = bar;
fun();
fun();
}
Run Code Online (Sandbox Code Playgroud)
我看不出任何问题,它工作正常(见这里),但我不确定这是否合法.有什么我想念的吗?也许在c ++标准草案中(我快速检查但到目前为止没有看到任何内容).
有没有办法知道你的程序是否在C++(甚至C)中有未定义的行为,而不是记住整个规范?
我问的原因是我注意到很多程序在调试中工作但没有发布是由于未定义的行为.如果有一个工具来至少帮助发现UB会很好,所以我们知道存在问题的可能性.
是什么区别i = ++i;,并++i;在那里i与值的整数10?
根据我的说法i,两个表达式完成后,两者都做同样的增量工作i =11.
据说在 C 中,当指针指向同一个数组或该数组末尾之后的一个元素时,算术和比较是明确定义的。那么数组第一个元素之前的一个呢?只要我不取消引用就可以了吗?
给定的
int a[10], *p;
p = a;
Run Code Online (Sandbox Code Playgroud)
(1) 写字合法--p吗?
(2)p-1在表达式中写入是否合法?
(3) 如果 (2) 没问题,我可以断言p-1 < a吗?
对此有一些实际的担忧。考虑一个reverse()函数,它反转以 结尾的 C 字符串'\0'。
#include <stdio.h>
void reverse(char *p)
{
char *b, t;
b = p;
while (*p != '\0')
p++;
if (p == b) /* Do I really need */
return; /* these two lines? */
for (p--; b < p; b++, p--)
t = *b, *b = *p, *p …Run Code Online (Sandbox Code Playgroud) 在C和C ++中,有许多操作会导致未定义的行为,即允许编译器执行所需操作的情况。示例包括在取消分配变量后使用变量,两次取消分配变量以及取消引用空指针。
Fortran是否也具有未定义的行为?我看了一份规范草案,但未能在其中找到任何东西。例如,在释放变量之后使用变量肯定会导致程序崩溃,还是它会默默地做错事?
在下面的代码示例中,C++标准是否保证在内存分配(调用operator new)之后但在调用X的构造函数之前评估'++ i'?
new X( ++i )
Run Code Online (Sandbox Code Playgroud) 我正在调试一个崩溃日志.发生崩溃是因为(c ++ - )对象的vtable指针是0x1,而对象的其余部分似乎可以从崩溃日志中看出来.
程序在尝试调用虚方法时崩溃.
我的问题:在什么情况下vtable指针变为空?operator delete是否将vtable指针设置为null?
这在OS X上使用gcc 4.0.1(Apple Inc. build 5493)发生.
我对c ++中的枚举变量有疑问:
type enmu {
DAY1 = 1,
DAY2,
DAY3,
DAY4
} DAYS;
void main() {
DAYS days;
}
Run Code Online (Sandbox Code Playgroud)
然后天的默认值是多少?