и Clang часто обыгрывают MSVC не только в асм коде, но и в реализации стандарта С++. И вдруг узнаю, что GCC и Clang применяют скалирующий фактор = 2, а у MSVC = 1.5 !!! Есть даже материалы, в которых говорится, что 1.5 лучше для реаллокации, поскольку дает возможность переиспользовать куски старой памяти - тем самым меньше фрагментации. Есть какие-то разъяснения по этому вопросу?
а с чем это связано? есть какие-то ссылки, что почитать. У меня было предположение, что это тесно связано с аллокаторам ядра ОС.
Частый аргумент — пусть аллокатор выделяет куски размером в размер вектора. Тогда для роста в x2 всегда нельзя будет переиспользовать память (каждый раз выделено суммарно меньше, чем нужно), а для x1.5 в теории можно склеить выданные ранее блоки, если они идут подряд, и переиспользовать. На практике аллокаторы так не делают
согласен, я про это же и писал, что лучше стремиться к 1,5 - так как есть возможность переиспользовать куски старой памяти, но как оказалось на практике в GCC и Clang ровно наоборот, отход от теоретического идеала, и просто увеличивают в 2 раза. Это мне показалось странным.
Ну так это просто увеличивает число реаллокаций и количество используемой памяти на реальных системах В теории 1.5 бывает лучше, конечно, но это несодержательно
Обсуждают сегодня