Недостатки пустого указателя в переполнении стека

Насколько я знаю, пустой указатель в C ++ void* может указывать на что угодно. Это может быть весьма полезно (для меня), если я хочу разработать решение без использования какого-либо наследования. Но вопрос, который я хочу знать, заключается в том, есть ли недостатки в этом подходе?

3

Решение

Самый большой недостаток заключается в том, что использование указателей void не позволяет компилятору осуществлять проверку типов. Особенно на языке, поддерживающем объектно-ориентированные принципы, я думаю, что было бы странно интенсивно использовать пустые указатели.

Скорее всего, вы найдете в C пустые указатели, имитирующие некоторое полиморфное поведение, но существуют те же проблемы безопасности типов.

9

Другие решения

Есть два серьезных недостатка производительности void*,
Во-первых, это делает его более трудным для понимания и
поддерживать программу, которая оказывает серьезное влияние на
производительность программистов обслуживания — и на
во время выполнения, поскольку это затрудняет переработку программного обеспечения
когда профилировщик показывает, где у вас проблемы с производительностью.
Самые быстрые программы — те, которые хорошо написаны первыми,
так как тогда становится возможным сделать локальные оптимизации в
критические места без необходимости переписывать весь
программа.

Второе влияние на производительность заключается в том, что void* может псевдоним
что-нибудь. Правильный анализ псевдонимов является важной частью
оптимизация компилятора и все, что вы делаете, чтобы сделать это более
Сложность мешает оптимизатору и может привести к замедлению работы кода.
(char* а также unsigned char* имеют аналогичный эффект.)

5

При использовании void* кроме факта, что компилятор не может делать предположения о типе, на который он указывает. Это все еще указатель, как и любой другой.

void* было полезно в C для указания на любой произвольный тип, потому что любой указатель на тип объекта может быть преобразован в void*, Тем не менее, выполнение практически всего с этим приведет к неопределенному поведению. Вы можете только безопасно привести его к исходному типу указателя.

Однако в C ++ у нас есть намного лучший способ хранения указателя на некоторый произвольный тип — шаблоны. Для некоторого аргумента шаблона Tмы можем иметь T*,

4

Там все еще могут существовать платформы, где void* больше, чем другие типы указателей, или имеет другой формат, поэтому приведение к или из void* превращается в реальный код конверсии. На обычном (x86, ARM) оборудовании это не так, поэтому проблем с производительностью нет void* — Вы просто отказываетесь от безопасности типа.

1

Да, у вас могут быть некоторые недостатки в производительности. Используя 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),

Подробнее о строгом алиасинге

1

void* может указывать на что угодно. Это может быть весьма полезно (для меня), если я хочу разработать решение без использования какого-либо наследования

Если вы думаете о прохождении void* указатель на какую-то функцию, подумайте уже о том, как она будет использоваться. Чтобы вызвать метод для этого объекта или получить доступ к его членам, вам все равно нужно знать тип этого объекта.

использование void* только если ты действительно должен. Если вы ищете способ более общего подхода к объектам, то просто выберите правильный дизайн ОО. Когда у вас есть void* указатель, единственное, что вы знаете, это то, что «что-то есть по этому адресу в памяти», ничего более.

Производительность использования void* указатели такие же, как и с любыми другими указателями. безопасности, понятность а также с этим связано растяжимость а также ремонтопригодность вашего кода должны быть ваши проблемы.

1

Я не понимаю, почему возникают проблемы с производительностью при использовании пустого указателя, в отличие от любого другого вида указателя. Я был бы больше обеспокоен безопасностью, от которой ты отказываешься с помощью пустого указателя.

0
По вопросам рекламы [email protected]