Насколько я знаю, пустой указатель в C ++ void*
может указывать на что угодно. Это может быть весьма полезно (для меня), если я хочу разработать решение без использования какого-либо наследования. Но вопрос, который я хочу знать, заключается в том, есть ли недостатки в этом подходе?
Самый большой недостаток заключается в том, что использование указателей void не позволяет компилятору осуществлять проверку типов. Особенно на языке, поддерживающем объектно-ориентированные принципы, я думаю, что было бы странно интенсивно использовать пустые указатели.
Скорее всего, вы найдете в C пустые указатели, имитирующие некоторое полиморфное поведение, но существуют те же проблемы безопасности типов.
Есть два серьезных недостатка производительности void*
,
Во-первых, это делает его более трудным для понимания и
поддерживать программу, которая оказывает серьезное влияние на
производительность программистов обслуживания — и на
во время выполнения, поскольку это затрудняет переработку программного обеспечения
когда профилировщик показывает, где у вас проблемы с производительностью.
Самые быстрые программы — те, которые хорошо написаны первыми,
так как тогда становится возможным сделать локальные оптимизации в
критические места без необходимости переписывать весь
программа.
Второе влияние на производительность заключается в том, что void*
может псевдоним
что-нибудь. Правильный анализ псевдонимов является важной частью
оптимизация компилятора и все, что вы делаете, чтобы сделать это более
Сложность мешает оптимизатору и может привести к замедлению работы кода.
(char*
а также unsigned char*
имеют аналогичный эффект.)
При использовании void*
кроме факта, что компилятор не может делать предположения о типе, на который он указывает. Это все еще указатель, как и любой другой.
void*
было полезно в C для указания на любой произвольный тип, потому что любой указатель на тип объекта может быть преобразован в void*
, Тем не менее, выполнение практически всего с этим приведет к неопределенному поведению. Вы можете только безопасно привести его к исходному типу указателя.
Однако в C ++ у нас есть намного лучший способ хранения указателя на некоторый произвольный тип — шаблоны. Для некоторого аргумента шаблона T
мы можем иметь T*
,
Там все еще могут существовать платформы, где void*
больше, чем другие типы указателей, или имеет другой формат, поэтому приведение к или из void*
превращается в реальный код конверсии. На обычном (x86, ARM) оборудовании это не так, поэтому проблем с производительностью нет void*
— Вы просто отказываетесь от безопасности типа.
Да, у вас могут быть некоторые недостатки в производительности. Используя void *
Вы можете отключить оптимизацию, основываясь на предположении о строгом псевдониме.
пример
void fun(void * param1, int & param2)
{
param2 = 7; // 1
// do something with param1, param2 not used
param2 += 1; // 2
}
Если бы не было void *
переменная, компилятор может удалить назначение 1, а в 2 просто сгенерировать param2 = 8
, Но сейчас не может, потому что param1
может указывать на param2
если вы звонили fun(&i, i)
,
void*
может указывать на что угодно. Это может быть весьма полезно (для меня), если я хочу разработать решение без использования какого-либо наследования
Если вы думаете о прохождении void*
указатель на какую-то функцию, подумайте уже о том, как она будет использоваться. Чтобы вызвать метод для этого объекта или получить доступ к его членам, вам все равно нужно знать тип этого объекта.
использование void*
только если ты действительно должен. Если вы ищете способ более общего подхода к объектам, то просто выберите правильный дизайн ОО. Когда у вас есть void*
указатель, единственное, что вы знаете, это то, что «что-то есть по этому адресу в памяти», ничего более.
Производительность использования void*
указатели такие же, как и с любыми другими указателями. безопасности, понятность а также с этим связано растяжимость а также ремонтопригодность вашего кода должны быть ваши проблемы.
Я не понимаю, почему возникают проблемы с производительностью при использовании пустого указателя, в отличие от любого другого вида указателя. Я был бы больше обеспокоен безопасностью, от которой ты отказываешься с помощью пустого указателя.