我正在尝试使用基本的Linux系统调用,并通过编写一个将随机字节写入文件的程序来编写好的代码。我已经设想了几种不同的方法来做这件事,但我很好奇哪种方法更有效。请随时给我改进我的代码或建议完全不同的方法;我只是在努力改进。
目前,我正在使用mt19937
从C++11的随机数中生成随机uint32_t
,并在写入文件之前使用memcpy将它们放在缓冲区中。这是一个非常有效的方法吗?
使用memset将缓冲区初始化为0并使用or‘’ing/bit-shifting会更好吗?说到这里,我忘记了如何/是否有一种方法可以做像*(buffer + offset) |= (random32 << BUF_SIZE - sizeof(random32) * currIndex)
这样的事情,并让C++放置所有32位而不是单个字符。
//Here's the actual buffer manipulation/write code I currently have
std::mt19937 rand(std::chrono::system_clock::now().time_since_epoch().count());
for(ssize_t i = 0; i < size; i += BUF_SIZE)
{
//Fill the buffer with random uint32_t's (the buffer is a multiple of 32 right now)
char buffer[BUF_SIZE];
for(int j = 0; j < BUF_SIZE; j += sizeof(uint32_t))
{
uint32_t num = rand();
std::fprintf(stderr, "DEBUG: generated random number %x\n", num);
std::memcpy(buffer + j, &num, sizeof(num));
}
// Write buffer to file
ssize_t bytes_left = size - i;
ssize_t bytes_to_write = BUF_SIZE > bytes_left ? bytes_left : BUF_SIZE;
std::fprintf(stderr, "DEBUG: writing %zu bytes to buffer\n", bytes_to_write);
if(write(fd, buffer, bytes_to_write) != bytes_to_write)
{
std::fprintf(stderr, "Failed to write at %zu", i);
exit(EXIT_FAILURE);
}
}
发布于 2019-06-06 18:10:26
执行以下操作:
::std::array<char, BUF_SIZE> buffer;
::std::generate(buffer.begin(), buffer.end(), rand);
而不是当前用来填充缓冲区的循环。然后调整程序的其余部分,使其使用具有自己的size
方法和类似方法的数组buffer
,而不是像现在这样的裸char
数组。
这更像是C++的方式,而不是你正在做的。尽量减少使用裸指针和数组。尽可能使用标准算法。如果您发现自己在编写for
循环,请查看算法库是否已经为您编写了循环。
这也适用于那些不在标准库中的代码。如果您发现自己在编写for循环,请停止。相反,应该弄清楚如何将for循环所做工作抽象到一个可重用的函数中,这样您就可以只编写一次for循环,并在很多情况下使用它。
如果你想了解标准库是如何工作的,那就自己去写那些函数吧。
不要重复自己是绝对最重要的编程原则之一。拉里·沃尔( Larry Wall )著名地将其改写为“懒惰”。学习如何永远不重复自己。如果标准库让你感到不舒服,因为你不知道它在做什么,试着使用编译器资源管理器来看看汇编语言。并尝试自己编写标准库函数。了解工具的上下和横向也是非常重要的。所以这项工作是值得做的。
但是,这才是你应该做的,而不是重复自己,一遍又一遍地训练自己。训练自己以正确的方式做这件事。如果你对不知道细节感到不舒服,那就写下细节,而不是用错误的方式来写,这样你就可以看到细节。
https://stackoverflow.com/questions/56482710
复制相似问题