我正在尝试使用基本的Linux系统调用,并通过编写将随机字节写入文件的程序来编写良好的代码。我已经设想了几种不同的方法,但是我很好奇哪种方法更有效。请随时为我的代码提供改进或建议完全不同的方法;我只是想改善。
目前,我正在使用C ++ 11的随机变量uint32_t
生成随机的mt19937
,并在写入文件之前使用memcpy将它们放置在缓冲区中。这是一种非常有效的方法吗?
我最好用内存集将缓冲区初始化为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);
}
}
答案 0 :(得分:2)
执行以下操作:
::std::array<char, BUF_SIZE> buffer;
::std::generate(buffer.begin(), buffer.end(), rand);
代替您当前正在使用的循环来填充缓冲区。然后调整程序的其余部分,以使用buffer
数组,该数组具有自己的size
方法等,而不是像现在这样的裸char
数组。
这比您正在做的更多的是C ++方式。尽量减少使用裸指针和数组。尽可能使用标准算法。如果您发现自己编写了for
循环,请查看算法库是否已经为您编写了循环。
这也适用于标准库中还没有 的代码。如果发现自己正在编写for循环,请停止。相反,要弄清楚如何将for循环的内容抽象到可重用的函数中,以便您可以编写一次for循环,并在很多情况下使用它。
如果您想了解标准库的工作原理,那么请自己编写这些函数。
不要重复自己是绝对最重要的编程原则之一。拉里·沃尔(Larry Wall)以“懒惰”而著名。了解如何永不重复自己。如果标准库因为您不知道它在做什么而使您感到不舒服,请尝试使用编译器资源管理器查看汇编语言。并尝试自己编写标准库函数。上下左右了解工具也非常重要。所以这项工作值得做。
但是,这就是您应该做的事情,不要重复自己,也不应该反复训练自己。训练自己以正确的方式做。而且,如果您对不知道细节感到不舒服,请写出细节,而不要用错误的方式写出来,这样您就可以看到细节。