小编0xh*_*ker的帖子

编译器在递归程序中的优化

我从尾调优化问题中获得了动力什么是尾部调用优化?

所以,我决定看看如何在平原C中做到这一点.

所以,我编写了2个阶乘程序,第1个可以应用尾部调用优化.我把这个事实函数称为事实(n,1).

unsigned long long int fact(int n, int cont)
{
      if(n == 0)
            return cont;

      else return fact(n-1, n * cont);
}
Run Code Online (Sandbox Code Playgroud)

2nd是需要多个堆栈帧的正常递归.

unsigned long long int fact(int n)
{
    if(n == 0)
        return 1;

    else return n * fact(n-1);
}
Run Code Online (Sandbox Code Playgroud)

这是由32位编译器为前者生成的-02组件

0x8048470 <fact>:   push   %ebp
0x8048471 <fact+1>: mov    %esp,%ebp
0x8048473 <fact+3>: mov    0x8(%ebp),%edx
0x8048476 <fact+6>: mov    0xc(%ebp),%eax
0x8048479 <fact+9>: test   %edx,%edx
0x804847b <fact+11>:    je     0x8048488 <fact+24>
0x804847d <fact+13>:    lea    0x0(%esi),%esi
0x8048480 <fact+16>:    imul   %edx,%eax
0x8048483 <fact+19>: …
Run Code Online (Sandbox Code Playgroud)

c compiler-construction gcc compiler-optimization tail-call-optimization

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

直接将数据流式传输到hdfs而无需复制

我正在寻找不同的选项,通过它我可以使用python直接将数据写入hdfs,而无需存储在本地节点上,然后使用copyfromlocal.

我想使用类似于本地文件的hdfs文件,并使用write方法将该行作为参数,具体如下:

   hdfs_file = hdfs.create("file_tmp")
   hdfs_file.write("Hello world\n")
Run Code Online (Sandbox Code Playgroud)

是否存在类似于上述用例的内容?

python hadoop hdfs

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

如何在非阻塞套接字上发送超时?

我在理解Linux中套接字的工作方面遇到了一些问题.

setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(int));
write = write(sockfd, buf, len);
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,写入被缓冲,发送超时没有任何意义(当用户空间缓冲区被复制到内核缓冲区时,写入系统调用将立即返回).发送缓冲区大小是更重要的参数,但发送超时似乎没有什么值得的.但我当然错了,因为我已经看到了很多使用SO_SNDTIMEO的代码.假设接收器非常慢,用户空间代码如何使用SO_SNDTIMEO超时?

sockets network-programming setsockopt

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

是否可以使用emacs缓冲区添加注释?

在处理项目或浏览代码时,我经常在emacs中打开许多缓冲区.在许多窗口中我经常会看到很多东西.当我脑海中的堆栈加深时,我经常会忘记我在一些缓冲区/文件中看到的特定内容,我打开了15-30分钟.有没有办法在我打开它们时为这些缓冲区添加一个小音符,所以我总是可以回到它们.

谢谢.

emacs bookmarks

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

为什么Facebook在memcached中将TCP用于SET而将UDP用于GET

我的问题是关于memcached的。Facebook使用memcached作为其结构化数据的缓存,以减少其用户的延迟。他们在Linux上使用UDP优化了memcached的性能。http://www.facebook.com/note.php?note_id=39391378919

但是有趣的是,他们仍然使用TCP进行设置操作,而使用UDP进行获取操作。

他们为什么要这样做?我的意思是为什么还不使用UDP进行设置操作?由于需要在操作系统中维护减少的状态,因此UDP的伸缩性优于TCP。

谢谢,

memcached caching key-value

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

如何自动生成C代码

我正在做一个 C 项目。我观察到很多代码可以根据某些规则自动生成。IE。如果我只指定C结构,基于此,代码可以自动生成。我知道可以做到,但我以前没做过。如果经验丰富的 C 程序员能够提供某些指导或分享他们关于如何以最少的工程工作完成此类事情的经验,那就太好了。

编辑:具体来说,我是否需要用 C 编写一个自定义解析器来完成所有这些操作,或者是否有一些更简单的方法来处理这个问题?

c code-generation

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

原子比较(不等于)和交换

我想使用原子比较和交换,但不是等于,我想只在内存位置不等于旧值时进行交换.在C中有可能吗?

c multithreading gcc compare-and-swap

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

为什么printf使用float和integer格式说明符打印随机值

我在64位机器上写了一个简单的代码

int main() {
    printf("%d", 2.443);
}
Run Code Online (Sandbox Code Playgroud)

所以,这就是编译器的行为方式.它将第二个参数标识为double,因此它将在堆栈上推送8个字节,或者可能只是在调用之间使用寄存器来访问变量.%d期望一个4字节的整数值,因此它打印一些垃圾值.

有趣的是,每次执行此程序时,打印的值都会发生变化.那么发生了什么?我希望它每次打印相同的垃圾值,而不是每次都不同.

c floating-point x86-64

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

为什么std :: map没有insert类型的插入函数(key&k,val&v)

为什么不std::map支持如下插入:

std::map<obj1, obj2> map_int;

void insert_map(obj1 &key, obj2 &val)
{
    map_int.insert(key, val);
}
Run Code Online (Sandbox Code Playgroud)

我知道上面的内容不正确.我想知道是什么阻止了这样设计插入函数.它比创建一对IMO更直观.

c++ std c++-standard-library c++11

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

从signed char到sign int的符号扩展如何工作?

为什么255由signed char表示的值会转换为-1整数?我看到一个mov sbl正在使用的指令x86转换成一个签名char来签署的int,但为什么它在现在这样的方式转换?

c signed type-conversion

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

从已删除的文件中读取

我在C中写了一个小程序,我成功打开了一个文件,然后叫睡眠20秒.在那20秒我用shell中的rm删除了打开的文件.睡眠后,程序成功读取数据并将其打印在屏幕上.

int bytes_read;
FILE *fp = fopen("/tmp/file", "r");
sleep(20);
bytes_read = fread(buf, 1, 5, fp);
buf[bytes_read] = '\0';
printf("%s", buf);
Run Code Online (Sandbox Code Playgroud)

我希望它读取0个字节,但它会在文件中打印实际数据.这种行为背后的解释是什么?

c linux filesystems file libc

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

为什么(-i)的类型(其中i是无符号整数)仍然是无符号整数?

int main() {
    unsigned int i = 1;
    typeof(-i) j = -i;
}
Run Code Online (Sandbox Code Playgroud)

当我查看jgdb中的类型时,它显示为type unsigned int。为什么类型没有移动到相应的带符号类型?选择这种行为背后有什么原因吗?我发现该类型是否可以更直观地转换为相应的带符号类型。

c c++ clang

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