В настоящее время я выполняю рефакторинг устаревшего кода и наткнулся на этот странный узел связанного списка
#define CACHE_LINE 128
struct Node {
public:
intptr_t value;
Node *next;
Node *prev;
bool dummy;
private:
// Avoid false sharing
unsigned char padding[CACHE_LINE - sizeof(intptr_t) - 2 * sizeof(Node *) - sizeof(bool)];
};
Предполагая, что строка кэша системы, над которой я работаю, имеет ширину 32 байта, это означает, чтоОбъект будет занимать до 4 строк кэша (с 32 байтами строки кэша).И 3 из них будут полностью пустыми.
Этот связанный список является частью очереди без блокировки.Я еще не определил, сколько производителей и сколько потребителей его используют.Из этого другого поста ответ гласит следующее:
Пояснение: для негативных последствий должен быть записан по крайней мере некоторый доступ к «ложно разделяемым» переменным.Если записи выполняются редко, влияние ложного обмена на производительность довольно незначительно;чем больше записей (и, таким образом, строка кэша делает недействительными сообщения), тем хуже производительность.
Мой вопрос заключается в следующем: что ухудшает мою производительность?Ложное разделение этого маленького объекта или тот факт, что четверть моего кэша будет заполнена заполнением?
Живое представление макета памяти в Проводник компилятора