Когда я вижу функцию, которая принимает указатель, он предлагает (по крайней мере мне) запросить владение ею.
Я не прыгаю прямо там, когдаЯ вижу функцию, которая принимает параметр указателя, и я не думаю, что вы тоже должны.Хотя важно знать о возможности, и вы хорошо ищите документацию, существует множество причин, по которым функция принимает параметр указателя, среди которых:
- , которую принимает функциямассивы через параметр.Это, безусловно, самая распространенная причина.
- функция хочет изменить объект, указанный ей вызывающей стороной (через указатель).Вероятно, это вторая наиболее распространенная причина.
- функция принимает указатель на структуру или объединение большого или потенциально большого размера, чтобы облегчить издержки вызова функции
функциипринимает указатель на структуру или объединение, потому что он соответствует соглашениям об интерфейсе, которые поддерживают древние компиляторы Си, которые не принимали структуры и объединения в качестве аргументов.Это было нормально для ранних компиляторов Си, так как изначально был задан язык:
[T] он только операции, которые вы можете выполнять над структурой, берет его адрес с &
и получает доступ к одномуего членов.[... Структуры] не могут быть переданы или возвращены из функций.[...] Указатели на структуры не страдают этими ограничениями [.]
(Kernighan & Ritchie, Язык программирования C , 1 st ed., раздел 6.2)
Стандарт C не имеет этих ограничений, но их влияние все еще ощущается в некоторых местах.
, которые ожидает функция (икак правило, переназначать) ответственность за освобождение динамически распределенного пространства, на которое указывает указатель, или за то, что он иным образом намеревается сделать копию указателя, который сохраняется после возврата функции, находятся далеко внизу списка.Если функция намеревается выполнить одно из этих действий, то я полностью ожидаю, что в ее документации будет указано каким-либо образом.
Эта подпись просто плохо оформлена?
НетЯ думаю, что его дизайн подсказывается одним или обоими последними двумя пунктами из моего списка.
Должны ли "sched_params params" жить в куче?
Я быне ожидайте, что это будет требованием.
Нужно ли пережить поток, чтобы оставаться действительным?Можно ли его удалить?
Я не думаю, что нужно пережить поток, свойства которого установлены.В дополнение к моей общей интерпретации интерфейса, я прочитал (слабую) поддержку этой позиции в формулировке спецификации POSIX функции:
Функция pthread_setschedparam()
должна устанавливать политику планирования и соответствующее планированиепараметры для потока, чей ID потока указан потоком для политики и связанных параметров , предоставленных в policy
и param
соответственно.
( спецификация POSIX для pthread_setscheduleparam()
; выделение добавлено)
Язык «предоставлено на» указывает мне (опять же, слабо), что функция использует содержимое структуры, на которую указываютне сама структура.