小编van*_*joe的帖子

我怎样才能省去对幂等函数的额外调用?

有没有办法告诉gcc,如果两个后续调用具有相同的参数,则只应调用一次具有副作用的函数.我想要以下行为:

foo(6);//run this function
foo(6);//optimize this away
foo(6);//optimize this away
foo(5);//run this function
foo(6);//run this function again
Run Code Online (Sandbox Code Playgroud)

我可以foo在做任何工作之前检查一个全局变量,但这不是最佳的.

void inline foo(int i){
   static int last_i=i+1;
   if(last_i != i){
        last_i==i;
        //do_work...
    }
}
Run Code Online (Sandbox Code Playgroud)

由于foo是内联函数,编译器应该能够查看调用,foo()并看到它不必执行它.问题是编译器不能像全局变量那样优化,有没有办法让编译器知道这样做是否安全?

c c++ gcc

8
推荐指数
3
解决办法
425
查看次数

在 emacs lisp 中将函数作为参数传递

我不确定 emacs lisp 究竟是如何处理函数对象的,是否有我没有看到的隐藏参数,当我有这个时,当我点击C-c p它时会给出错误 Wrong type argument: commandp, load-cenet-files

我根本不懂 lisp。

(defun load-cenet-files ()
  (load-file "~/.emacs.d/cedet/common/cedet.elc")
  (require 'semantic-gcc)
)

(global-set-key (kbd "C-c p") '(load-cenet-files)) 
Run Code Online (Sandbox Code Playgroud)

elisp

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

串行通信中的字节对齐

所以我试图为串行通信定义一个通信协议,我希望能够向设备发送4个字节的数字,但我不确定如何确保设备开始在正确的字节上拾取它.

例如,如果我想发送

0x1234abcd 0xabcd3f56 ...
Run Code Online (Sandbox Code Playgroud)

我如何确保设备不会在错误的位置开始读取并获得第一个单词:

0xabcdabcd
Run Code Online (Sandbox Code Playgroud)

这样做有一个聪明的方法吗?我想过用一个标记来开始一条消息,但如果我想发送我选择的数字作为数据呢?

serial-port communication-protocol

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

从stderr而不是stdin读取

我在野外遇到了这样的代码,我想知道为什么会这样.代码从stderr(fd == 2)而不是stdin(fd == 0)读取.奇怪的是这实际上有点起作用.您可以在控制台读取输入,但不能输入管道输入.知道这里发生了什么吗?

#include <stdio.h>
#include <unistd.h>
int main(){
   char buf[15];
   int nchars=read(2,buf,15);
   printf("%d '%s'\n",nchars,buf);
}
Run Code Online (Sandbox Code Playgroud)

c linux stdin unistd.h stderr

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

标签 统计

c ×2

c++ ×1

communication-protocol ×1

elisp ×1

gcc ×1

linux ×1

serial-port ×1

stderr ×1

stdin ×1

unistd.h ×1