Согласно спецификации языка шейдинга Metal ( https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf , комментарии в соответствии с таблицей 12)
[ 114] Для[[color(m)]]
m используется для указания индекса цветового вложения при доступе (чтение или запись) нескольких цветовых вложения в функции фрагмента. Атрибут[[color(m)]]
поддерживается только в iOS.blockquote>
Это означает, что вы не можете выполнять повторное считывание пикселей (считывание уже отрисованных пикселей из прикрепленной текстуры за один проход визуализации).
Одним из способов избежать повторного считывания пикселей является запись и считывание пикселей за отдельные проходы рендеринга: вы рендерите то, что хотите, на первом проходе рендеринга, а затем присоединяете результат первого прохода рендеринга в качестве текстуры, которую вы можете взять в качестве образца. или просто прочитайте.
Сам Stroustrup отвечает. Выборка:
C++ явно позволяет реализацию, удаляют для обнуления lvalue операнда, и я надеялся, что реализации сделают это, но та идея, кажется, не стала популярной у реализаторов.
Но основной вопрос, который он поднимает, - то, что аргументом delete не должен быть lvalue.
Указатель может быть сохранен больше чем в одной переменной, устанавливание в NULL одного из них все еще оставило бы недопустимые указатели в других переменных. Таким образом, Вы действительно не получаете много, Вы более вероятно создаете ложное чувство защищенности.
Кроме того, этого, можно создать собственную функцию, которая делает то, что Вы хотите:
template<typename T>
void deleten(T *&ptr) {
delete ptr;
ptr = NULL;
}
Во-первых, установка в NULL потребовала бы, чтобы память сохранила переменную. Это верно, что у Вас обычно есть указатель в переменной, но иногда Вы могли бы хотеть удалить объект в справедливом расчетном адресе. Это было бы невозможно с "аннулированием", удаляют.
Затем прибывает производительность. Вы, возможно, написали код таким способом, которым указатель сразу выйдет из объема после того, как удалят, сделан. Заполнение его с пустым указателем является просто пустой тратой времени. И C++ является языком с, "не нуждаются в нем? затем Вы не должны оплачивать его" идеологию.
При необходимости в безопасности существует широкий спектр интеллектуальных указателей в Вас сервис, или можно записать собственное - лучше и более умный.
У Вас может быть несколько указателей, указывающих на ту память. Это создало бы ложное чувство защищенности, если бы указатель, который Вы указали для удаления, был установлен в NULL, но все другие указатели не сделали. Указатель является не чем иным как адресом, числом. Это мог бы также быть интервал с разыменовать операцией. Моя точка - Вы, должен был бы также просканировать каждый указатель для нахождения тех, которые ссылаются на ту же память, которую Вы просто удалили, и аннулируйте их также. Это было бы в вычислительном отношении интенсивно, чтобы просканировать все указатели для того адреса и аннулировать их, потому что язык не разработан для этого. (Хотя некоторые другие языки структурируют свои ссылки для выполнения подобной цели по-другому.)
Если у Вас есть массив указателей, и Ваше второе действие должно удалить пустой массив, то нет никакого смысла устанавливающего каждое значение в NULL, когда память собирается, освобождены. Если Вы хотите, чтобы это было пустым.. запишите пустой указатель в него :)
Поскольку нет действительно никакой потребности к, и потому что она потребовала бы, удаляют от указателя к указателю взятия, а не просто указатель.
delete
используется главным образом в деструкторах, в этом случае устанавливание в NULL участника бессмысленно. Несколько строк позже, при закрытии }
, участник больше не существует. В операторах присваивания удаление обычно сопровождается присвоением так или иначе.
Кроме того, это представило бы следующий недопустимый код:
T* const foo = new T;
delete foo;
Установка в NULL указателя автоматически не решила бы большинство проблем с использованием неверного указателя. Единственный катастрофический отказ, которого это избежало бы, - то, при попытке удалить его дважды. Что, если Вы называете функцию членства на таком указателе? Это все еще отказало бы (предполагающий, что это получает доступ к членским переменным). C++ не ограничивает Вас в вызывании никакой функции на Нулевых указателях, и при этом это не должно делать этого с точки зрения производительности.
Философия C++ является "платой за него, только если Вы используете его". Я думаю, что это может ответить на Ваш вопрос.
Также иногда у Вас могла быть своя собственная "куча", которая восстановит удаленную память.. или иногда указатель, не принадлежавший любой переменной. Или указатель, сохраненный в немногих переменных - это возможный нуль только один из них.
Поскольку Вы видите, что он имеет много проблем и возможных проблем.
C++ позволяет Вам определять свой собственный новый оператор и удалять так, чтобы, например, они использовали бы Ваше собственное средство выделения пула. Если Вы делаете это затем, возможно использовать новый и удалить с вещами, которые не являются строго адресами, но говорят что индексы в Вашем массиве пула. В этом контексте значение ПУСТОГО УКАЗАТЕЛЯ (0) могло бы иметь легальное значение (относящийся к первому объекту в пуле).
Так наличие удаляет ПУСТОЙ УКАЗАТЕЛЬ набора автоматически к его аргументу, не всегда имеет значение - устанавливает значение к недопустимому значению. Недопустимое значение не может всегда быть НУЛЕВЫМ.