Наши партнеры

UnixForum





Библиотека сайта 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, изменяться могут).


Предыдущий раздел:   Следующий раздел:
Назад Оглавление Вперед