小编san*_*oyd的帖子

calloc的两个参数

为什么要calloc采用两个参数而不是一个malloc

具体来说,由于以下表达式之间没有区别(或存在?):

calloc (a, b);
calloc (b, a);
calloc (a * b, 1);
calloc (1, a * b);
Run Code Online (Sandbox Code Playgroud)

为什么不接受要分配的总字节数?这个界面背后的理由是什么?为什么这不适用于malloc?

c calloc

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

有人可以解释以下内存分配C程序的性能行为吗?

在我的机器上,时间A和时间B交换取决于是否A定义(这改变了calloc调用两个s 的顺序).

我最初将此归因于寻呼系统.奇怪的是,当 mmap用它代替时calloc,情况更加眩晕 - 两个循环都需要相同的时间,如预期的那样.可以看出strace,callocs最终导致两个 mmaps,因此没有返回已经分配的内存魔法.

我在Intel i7上运行Debian测试.

#include <stdlib.h>
#include <stdio.h>
#include <sys/mman.h>

#include <time.h>

#define SIZE 500002816

#ifndef USE_MMAP
#define ALLOC calloc
#else
#define ALLOC(a, b) (mmap(NULL, a * b, PROT_READ | PROT_WRITE,  \
                          MAP_PRIVATE | MAP_ANONYMOUS, -1, 0))
#endif

int main() {
  clock_t start, finish;
#ifdef A
  int *arr1 = ALLOC(sizeof(int), SIZE);
  int *arr2 = ALLOC(sizeof(int), SIZE);
#else
  int *arr2 = ALLOC(sizeof(int), SIZE);
  int …
Run Code Online (Sandbox Code Playgroud)

c unix linux compiler-construction performance

14
推荐指数
3
解决办法
1365
查看次数

奇怪的使用虚空

我一直在浏览一些C源代码,并注意到以下内容:

void some_func (char *foo, struct bar *baz)
{
    (void)foo;
    (void)baz;
}
Run Code Online (Sandbox Code Playgroud)

为什么void在这里使用?我知道(void)在表达式明确指出该值被丢弃之前 ; 但有人可以解释一下这种用法的理由吗?

c void

11
推荐指数
3
解决办法
597
查看次数

如何使用命名上下文查找de Bruijn自由变量索引?

在"类型和编程语言"的6.1.2节中,他们讨论了用于对lambda表达式中的自由变量进行编号的命名上下文.使用示例方案,他们已经提供了,都?x.xb?x.xx都会有自己的德布鲁因表示形式?.00时,他们明显不同的术语.这是如何运作的?

lambda-calculus

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

在x86机器上减去`x`和添加`-x`有什么区别?

是否存在语义差异?在特定情况下,其中一个可能更快吗?

compiler-construction x86 assembly

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

内存映射POSIX中的文件

当系统中的内存映射文件时POSIX,我们是否需要保持文件描述符打开,直到我们完成mmaped内存块(close在我们之后munmap)或者可以(应该?)close文件描述符一旦mmap成功?两者似乎都适用于我的Linux系统.

c posix mmap

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