Статический бросок по сравнению с динамическим броском для того, чтобы пересечь иерархии наследования

В Python, если я гашу (или изменяют метод) и затем не имеют времени для тестирования его в тот день, я переполняю в, "утверждают Ложь" так, чтобы код отказал, если метод будет выполнен, то создавая смущающие ошибки я замечу на следующий день. Намеренная синтаксическая ошибка может быть полезной также.

Пример:

def somefunction(*args,**kwargs):
    ''' <description of function and args> '''
    # finish this in the morning
    assert False, "Gregg finish this up"
5
задан Martin B 5 September 2009 в 06:13
поделиться

4 ответа

static_cast per se НЕ ТРЕБУЕТСЯ RTTI - typeid требует (как и dynamic_cast ), но это полностью другой вопрос. Большинство приведений просто говорят компилятору: «Поверьте мне, я знаю, что делаю» - dynamic_cast является исключением, он просит компилятор проверить во время выполнения и, возможно, завершится ошибкой. Вот тут-то и большая разница в производительности!

9
ответ дан 18 December 2019 в 07:10
поделиться

Было бы намного лучше вообще избегать переключения типов, если это возможно. Обычно это делается путем переноса соответствующего кода в виртуальный метод, который реализуется по-разному для разных подтипов:

class Shape {
public:
    virtual ~Shape() {};
    virtual void announce() = 0;  // And likewise redeclare in Circle and Square.
};

void Circle::announce() {
    cout << "It's a circle!" << endl;
}

void Square::announce() {
    cout << "It's a square!" << endl;
}

// Later...
s->announce();

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

Дополнительная информация: static_cast не требует RTTI, но его использование может быть небезопасным, что приведет к неопределенному поведению ( например, сбой). dynamic_cast безопасен, но медленен, потому что он проверяет (и, следовательно, требует) информацию RTTI. Старое приведение в стиле C даже более опасно, чем static_cast , потому что оно незаметно выполняет приведение к совершенно несвязанным типам,

7
ответ дан 18 December 2019 в 07:10
поделиться

С помощью статического преобразования (и проверки typeid) вы не можете понижать до промежуточного типа (потомок происходит от отца, наследуется от деда, вы не можете понижать от деда к отцу) использование немного более ограничено. static_cast без проверки typeid жертвует правильностью ради производительности, и тогда вы знаете, что они говорят:

Тот, кто жертвует правильностью ради производительности, не заслуживает ни того, ни другого

Тогда, конечно, бывают ситуации, когда вы отчаянно нуждаетесь в нескольких процессорах инструкции, и больше некуда искать улучшения, и вы действительно в безопасности в том, что делаете, и вы заверили (верно?), что единственное место для повышения производительности - это использование static_cast вместо dynamic_cast ... тогда вы знаете, что должны переделать ваш дизайн, или ваши алгоритмы, или лучшее оборудование.

Ограничения, которые вы накладываете при использовании rtti + static_cast, заключаются в том, что вы не сможете расширить свой код новыми производными классами в более позднее время, не переработав все места, где вы использовали этот трюк, чтобы получить всего несколько инструкций процессора. Сама переделка, вероятно, потребует больше времени (время разработки, которое дороже), чем время процессора, которое вы получили. Если, по крайней мере, время, потраченное на снижение качества, заметно, то переработайте свой дизайн, как предлагает j_random_hacker, это улучшит как дизайн, так и производительность.

Сама переделка, вероятно, потребует больше времени (время разработки, которое дороже), чем время процессора, которое вы получили. Если, по крайней мере, время, потраченное на снижение качества, заметно, то переработайте свой дизайн, как предлагает j_random_hacker, это улучшит как дизайн, так и производительность.

Сама переделка, вероятно, потребует больше времени (время разработки, которое дороже), чем время процессора, которое вы получили. Если, по крайней мере, время, потраченное на снижение качества, заметно, то переработайте свой дизайн, как предлагает j_random_hacker, это улучшит как дизайн, так и производительность.

5
ответ дан 18 December 2019 в 07:10
поделиться

dynamic_cast вернет NULL, если вы не выполнили проверку typeid и преобразование не удалось. static_cast завершится успешно (и приведет к неопределенному поведению, например к возможному сбою). Вероятно, это разница в скорости.

1
ответ дан 18 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: