C++ 如何将缓冲区传递给write(),而不为其分配内存

C++ 如何将缓冲区传递给write(),而不为其分配内存,c++,c,memory-management,C++,C,Memory Management,这个问题很难用语言表达,但我会尽力的。 我想测试我的usb连接的性能,因此我在一个嵌入式设备上使用gadgetfs,这样我就可以只写一个filedescriptor,然后将数据发送到主机。 但当我想要发送大量数据时,我无法分配我想要的数据量 write(int fildes, const void *buf, size_t nbyte); 有没有一种方法可以将指针传递到内存中某个地方,在那里它可以实际读取nbyte字节? 我无法分配要发送的大小的数组或向量。因为我得到了一个“无法分配内存”错误

这个问题很难用语言表达,但我会尽力的。 我想测试我的usb连接的性能,因此我在一个嵌入式设备上使用gadgetfs,这样我就可以只写一个filedescriptor,然后将数据发送到主机。 但当我想要发送大量数据时,我无法分配我想要的数据量

write(int fildes, const void *buf, size_t nbyte);
有没有一种方法可以将指针传递到内存中某个地方,在那里它可以实际读取
nbyte
字节?
我无法分配要发送的大小的数组或向量。因为我得到了一个“无法分配内存”错误。

write函数将接受您给它的任何地址,并(尝试)从该地址开始写入
nbyte
字节。只要内存可以读取,就可以正常工作


如果您想发送超过几千字节的数据,最好是以相对较小的大小(比如4KB)进行多次写入,然后使用循环完成写入

write函数将接受您给它的任何地址,并(尝试)从该地址开始写入
nbyte
字节。只要内存可以读取,就可以正常工作


如果您想发送超过几千字节的数据,最好是以相对较小的大小(比如4KB)进行多次写入,然后使用循环完成写入

如果您的操作系统具有
MAP\u ANONYMOUS
/dev/zero
,则您可以
mmap
将其映射到您的虚拟地址空间,并从那里读取

#include <sys/mman.h>

void * zeroed_memory = mmap(NULL, nbytes, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);

如果您的操作系统具有
MAP\u ANONYMOUS
/dev/zero
,则您可以
mmap
将其映射到虚拟地址空间中,直到最大可能的映射并从那里读取

#include <sys/mman.h>

void * zeroed_memory = mmap(NULL, nbytes, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);

你能分配更少的资源并循环发送吗?或者,在您使用的环境中,这是不可能的?是否需要一次写入?如果您可以使用多个写入调用,则分配较小的内存(尽可能),然后在循环中多次发送相同的数据。。所以你可以用单次分配来分析写速度。你能分配得少一点并在循环中发送吗?或者,在您使用的环境中,这是不可能的?是否需要一次写入?如果您可以使用多个写入调用,则分配较小的内存(尽可能),然后在循环中多次发送相同的数据。。因此,您可以通过单个分配来分析写入速度。问题是,出于某种原因,我必须(主机端)读取我在小工具上执行的每个
write()
。因此,当我循环写操作时,主机必须先读取4个字节,然后才能调用下一个
write()
。您是说,如果从目标发送1MB,主机必须将其作为单个1MB读取来读取,否则它将“跳过”数据?我觉得这很奇怪。但是,是的,最终会在某一点或另一点出现一些阻塞,你需要等待另一端“赶上”。这就是为什么我建议每次4KB,作为一次编写一个单词和数百KB或MB的折衷方案。不确定您实际期望的其他答案-我认为没有其他解决方案。如果写入的数据重复,我可能建议使用
writev()
。您可以多次给一个指向同一缓冲区的iovec。
writev
只有在您想多次写入同一数据时才有帮助。从OP上看还不清楚这是否是一个愿望。@Hasturkun实际上帮了很多忙!因为我想测试性能,所以我不关心实际发送的数据。谢谢问题是,出于某种原因,我必须(主机端)读取我在小工具上执行的每个
write()
。因此,当我循环写操作时,主机必须先读取4个字节,然后才能调用下一个
write()
。您是说,如果从目标发送1MB,主机必须将其作为单个1MB读取来读取,否则它将“跳过”数据?我觉得这很奇怪。但是,是的,最终会在某一点或另一点出现一些阻塞,你需要等待另一端“赶上”。这就是为什么我建议每次4KB,作为一次编写一个单词和数百KB或MB的折衷方案。不确定您实际期望的其他答案-我认为没有其他解决方案。如果写入的数据重复,我可能建议使用
writev()
。您可以多次给一个指向同一缓冲区的iovec。
writev
只有在您想多次写入同一数据时才有帮助。从OP上看还不清楚这是否是一个愿望。@Hasturkun实际上帮了很多忙!因为我想测试性能,所以我不关心实际发送的数据。谢谢