@Eugene-123

Есть разница, на низком уровне, между классом со статичными полями и глобальным экземпляром класса?

Допустим есть два варианта:
Вариант 1. Структура со статичными полями
// MyPool.h
struct MyPool {
  static unsigned int capacity;
  static unsigned int numOfAllocatedObjects;
}

// MyPool.cpp
unsigned int MyPool::capacity {1024};
unsigned int MyPool::numOfAllocatedObjects {0};


Вариант 2. Глобальный объект:
// MyPool.h
struct MyPool {
  unsigned int capacity {1024};
  unsigned int numOfAllocatedObjects {0};
}

extern MyPool MyGlobalPool;

// MyPool.cpp
MyPool MyGlobalPool {};


В первом варианте я не смогу создать еще один экземпляр. Но меня это не интересует. Меня интересует есть ли разница с точки зрения производительности? На другом ресурсе мне сказали, что второй вариант с точки зрения поддержки кодовой базы - плохой вариант.
  • Вопрос задан
  • 58 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Нет разницы.

Можно же проверить самостоятельно. Технологии нынче - все легко. Вот: https://godbolt.org/z/PKWPdY4nn

Как видите, и то и другое компилируется в практически одинаковые инструкции:

eax, DWORD PTR MyGlobalPool[rip+4]
...
eax, DWORD PTR MyPool1::numOfAllocatedObjects[rip]


И там и там просто загрузка какого-то статичного адреса глобальной переменной. Вообще говоря, в случае с глобальной переменной компилятор мог бы сдлеать и 2 действия: взять адрес переменной и прибавить смещение поля. Но он, как видите, достаточно умный, чтобы сделать все в одну инструкцию.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@User700
Скорее всего низкоуровневой разницы нет, если речь об одном глоб. объекте во втором случае:
https://godbolt.org/z/YaWccvPx3
Мне кажется, если это pool для аллокации памяти и т.д., то предпочтительно ближе ко второму варианту, т.к. можно создавать разные пулы одного типа в одной программе. Скорее даже лучше что-то вроде shared_ptr на pool у аллокатора...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы