Библиотека сайта rus-linux.net
На главную -> MyLDP -> Программирование и алгоритмические языки
Ulrich Drepper "Как писать разделяемые библиотеки" | ||
Назад | Оглавление | Вперед |
2.4. Выбор правильного типа данных
Выбор правильного типа данных может оказать существенное влияние на функциональные возможности, на время запуска и на размер программы. В большинстве ситуаций понятно, какой тип данных является правильный, но иногда есть альтернативные варианты и в иных случаях может быть предпочтительнее незначительно изменить код. В этом разделе предлагаются несколько конкретных примеров, что ни в коем случае не означает, что это полное перечисление всех случаев, в которых возможна оптимизация.
2.4.1. Сравниваем указатели и массивы
В некоторых ситуациях в языке C различия между указателями и массивами достаточно небольшие, либо их даже совсем нет. Прототипы
void scale (int arr[10], int factor)
и
void scale (int *arr, int factor)
на самом деле в большинстве случаев эквиваленты. Поэтому сложилось впечатление, что различий никогда не бывает и часто можно встретить следующий код:
char *str = "some string";
В некоторых ситуациях это правильно и имеет смысл. Переменная str создается с начальным значением, которое является указателем на строку. Некоторыми компиляторами этот конкретный кусок кода компилируется нормально, но в случае компилятора gcc будет сгенерировано предупреждение. Подробнее об этом в следующем разделе.
Здесь дело в том, что в этой ситуации зачастую нет необходимости использовать переменную. Может так случиться, что присваивание значения переменной str выполнено не будет (заметьте: не строке, а переменной-указателю). Значение может использовать только при вводе/выводе, генерации строк, сравнении строк или еще где-нибудь.
Если это так, то приведенный выше код не является оптимальным и представляет собой лишнюю трату ресурсов. Все, что необходимо, это - сама строка. Поэтому более аккуратное определение должно было бы выглядеть следующим образом:
char str[ ] = "some string";
Это нечто совершенно иное, чем код, приведенный ранее. Здесь str является именем последовательности байтов, в которой первоначально находится последовательность "some string". За счет такого переписывания кода мы можем сохранить одну переменную-указатель в неразделяемом сегменте данных, и выполнять одно относительное перемещение с тем, чтобы инициализировать переменную значением указателя на строку. В конце концов, компилятор может сгенерировать лучший код, поскольку известно, что значение str никогда не может изменяться (байты, на которые указывает str, изменяться могут).
Предыдущий раздел: | Следующий раздел: | |
Назад | Оглавление | Вперед |