【问题标题】:Is there a way to have a bit bucket pointer? (C/C++)有没有办法拥有一个位桶指针/C++)
【发布时间】:2011-02-12 02:24:53
【问题描述】:

有没有办法获得位桶指针?

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

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

谢谢, 陈兹

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

【问题讨论】:

  • 您想通过实施这项技术解决什么问题?
  • 考虑一下这句话的真正含义。您正在调用不一定在 C 或 C++ 中的系统函数。 API 通常定义为接受 32 或 64 位值,表示函数将写入的 RAM 中的地址。操作系统功能已经编译,写入到位。有两种可能的选择:写入工作(不是 bitbucket)或失败(页面错误,昂贵)

标签: c++ c pointers system-calls bitbucket


【解决方案1】:

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

【讨论】:

  • 实际上不,你不能用 C 或 C++ 做任何事情。具体来说,您无法重新连接硬件,这就是创建不与有效内存重叠的无限长缓冲区所必需的。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    如果是文件,可以通过查找跳过数据。 mmaping /dev/null 将在写入内存区域时分配和消耗内存。在任何情况下,您都不清楚您要做什么。

    【讨论】:

      【解决方案4】:

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

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

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

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

            例子:

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

            谢谢, 陈兹

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-03-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-08-24
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多