Я не уверен, что тема правильная, но я постараюсь объяснить мою проблему ниже.То, что я ищу, - это своего рода «академический ответ», потому что я полагаю, что оба моих решения дают схожие результаты во время выполнения.
У меня есть программа C ++ в Linux, которая выполняет много сетевых операций ввода-вывода.операции, и мне интересно, лучше ли встроить буфер в класс клиента или распределить его динамически.Первое решение с использованием встроенных буферов:
template <size_t buffer_size> class Buffer
{
// ...
char buffer [buffer_size];
}
class TcpClient
{
// ...
Buffer<1024> input_buffer;
Buffer<1024> output_buffer;
}
Второе с использованием динамически распределенных буферов:
class Buffer
{
Buffer (size_t buffer_size) :
buffer (malloc (buffer_size))
{
// ...
}
// ...
char* buffer;
}
class TcpClient
{
// ...
Buffer input_buffer (1024);
Buffer output_buffer (1024);
}
Теперь, сравнивая оба решения, я вижу, что первое требует меньше операций выделения памяти, чем второе,Следующая вещь - благодаря шаблонам компилятор знает размер класса во время компиляции.Первое решение должно дать лучшую ссылочную локальность (?), И компилятор также может выровнять размер класса по своему усмотрению.Также у нас есть прямой доступ к буферам, потому что нам не нужно выполнять дополнительную операцию разыменования указателя.
Я начал думать, как объекты TcpClient из первого решения ведут себя в кэше процессоров.Каждый раз, когда мы обращаемся к такому объекту в коде, он загружается в кэш процессоров, и его буферы тоже копируются, даже если они нам не нужны.Это может сделать кэш неэффективным, потому что мы храним там много данных, что увеличивает вероятность ошибок поиска памяти, верно?
Разве процессор не тратит время на копирование буферов в кэш все время?Каковы другие эффекты обоих решений с точки зрения процессора и операционной системы?Лучше ли держать размер класса маленьким или строить как можно больше?