3

有没有办法有一个位桶指针?

许多 IO(特别是与输入相关的)系统调用将数据返回到特定大小的缓冲区。有没有一种技巧或方法来制作一个排序位桶指针,所以我可以接受任何数量的数据,这些数据将被丢弃。做类似“char tmp[INT_MAX]”的事情很疯狂。我正在寻找的行为类似于 /dev/null,仅在指针世界中。

不要对此抱有希望....只是好奇。

谢谢,陈兹

更新:也许 mmap-ing /dev/null。问这个问题的时候忘记了。

4

7 回答 7

2

你用的是哪个IO接口?如果它是基于 FILE 的方法(fopen、fread 等),您可以继续读取同一个缓冲区并忽略其内容。你可以在 C/C++ 中做任何事情,所以你想要的当然是可能的,但是你想要做什么并不完全清楚。也许发布一些代码?

于 2010-04-25T14:10:54.223 回答
1

If it's a file, you can skip data by seeking. mmaping /dev/null WILL allocate and consume memory when the memory area is written to. In any case, it's not really clear what you're trying to do.

于 2010-04-25T14:56:56.383 回答
1

我想只是堆栈上的一个临时数组可以读取虚拟数据。尝试一些复杂的方法可能会使 CPU 缓存失效并降低性能。

于 2010-04-25T14:18:01.570 回答
0

许多 IO(特别是与输入相关的)系统调用将数据返回到特定大小的缓冲区。

通常,该大小要么很小,要么是用户指定的。

如果是预定义的小尺寸,则在堆栈上分配缓冲区并忽略结果。

如果您指定大小,请查看大小指定为零是否会导致缓冲区被忽略。如果是这样,那就去做吧。如果没有,分配一些小缓冲区并(如有必要)重复调用该函数以通过它刷新所有不需要的数据。

也许,写函数的作者并要求允许一个 NULL 缓冲区指针也是一个好主意。

于 2010-04-25T16:10:56.140 回答
0

您可以将单个分配的页面映射到一堆连续的虚拟地址。但是,如果您将指针增加足够多的次数,它最终会从末端脱落。没有办法解决这个问题,如果增量足够,您提供的任何指针最终都会指向重要的东西。

如果您调用的 API 接受迭代器而不是指针,您的状态会更好,因为您可以使迭代器的递增成为无操作。

于 2010-04-25T16:16:39.857 回答
0

也许你可以寻找你想去的地方。

于 2010-04-25T16:23:56.087 回答
0

我想出的唯一方法是编写某种系统调用,将程序中的所有虚拟内存切换到另一个伪程序虚拟内存空间。但是伪内存空间将是只写的,从不存储。然后,当您完成写入“NULL 指针”时,您将切换回虚拟内存空间。

例子:

  main() 
  {
    int fd = open("file", O_RDONLY);
    null_vm();
    read(fd, NULL, UINT_MAX);
    unnull_vm();
    close(fd);
    return;
  }

谢谢,陈兹

于 2010-06-17T13:00:48.990 回答