Время компиляции огромно для статически инициализированного большого массива (например, запись 65536) - PullRequest
3 голосов
/ 02 февраля 2012

Я хочу инициализировать глобальный массив структуры в файле .cpp.Мой размер массива составляет около 70000. Каждая структура будет содержать два указателя (размером 4 байта каждый)..cpp Размер файла после инициализации становится больше 1 МБ.Помимо этого большого глобального массива, у меня есть несколько (10) маленьких переменных (10-20 байт).

Когда я компилирую этот файл в Visual Studio 2005, компиляция занимает около 10 минут.Но когда я разбиваю этот массив из 70000 записей на два массива по 35000 записей в каждом, тогда время компиляции становится равным 5 минутам (половина первоначального времени сборки).Но из-за ограничений проекта я не хочу разбивать глобальный массив на несколько маленьких массивов.Но мы также хотим сократить время компиляции.Пожалуйста, дайте нам знать, есть ли какие-то приемы оптимизации компиляции или приемы кодирования, позволяющие сократить время компиляции.

    Struct node
    {
    char* name;
    int* ptr;
    }
    typedef Struct node NODE;

    NODE invalidNode = {invalidNodeName,NULL};

    NODE nodelist_10_nodeArray[] = {{"PETER",NULL},
                    invalidNode,
                    invalidNode,
                    invalidNode,
                    {"George",NULL}
                    {"SUNDAR",NULL}
                    invalidNode,
                    ...,
                    ...,
                    ...,

                        },

Примечание.

Ответы [ 3 ]

1 голос
/ 02 февраля 2012

Первый вопрос: должен ли этот массив быть статическим?Но если это так, то вы могли бы просто выделить место во время компиляции, но заполнить массив из файла во время выполнения?

Если у вас много недопустимых записей, вы можете рассмотреть какой-нибудь хеш-контейнер при условии, что вы не зависите от произвольного доступа.

1 голос
/ 02 февраля 2012

Вы можете установить массив с пустыми записями, затем заполнить допустимые.

Или (отвратительный хак, который, вероятно, не переносим), вы можете предположить, что отдельные массивы будут появляться последовательно в памяти и простовсе равно разбейте их.

То есть:

NODE nodelist_10_nodeArray[] = { half the data };
NODE nodelist_10_nodeArray1[] = { the other half of the data };

Если у вас нет проверки границ массива, это / должно / работать.Но я бы добавил очень-очень очевидный комментарий в ваш исходный код, до, после и между каждым разделом, что это отвратительный взлом.

Но почти любое другое решение предпочтительнее, так как оно опирается на определение реализацииповедение.

1 голос
/ 02 февраля 2012

Если у вас много недопустимых записей, которые должны возвращать одно и то же значение, вам следует подумать об использовании какого-либо словаря.

Вы можете использовать std::map<int, NODE> и заполнить его во время выполнения (только сдействительные записи).Но заполнение его во время выполнения может быть проблемой производительности (и вам нужно больше памяти, это зависит от соотношения действительных и недействительных записей).Поиск определенного индекса также будет выполняться медленнее, он будет принимать O (log (n)) вместо O (1) .

Другое решение: Создатьмассив в куче, используя new и заполните его.Вы можете заполнить его из файла во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...