Возможности библиотеки C ++ 11 зависят от конкретных прокси-серверов - PullRequest
12 голосов
/ 12 сентября 2011

Методом проб и ошибок было доведено до моего сведения, что существуют определенные функции C ++ 11, которые зависят от некоторой разновидности магии компилятора (TM). Я возился с реализацией своего собственного стандартного стандартного stdlib. Я знаю, что есть легкодоступные реализации stdlib, но эта является моей личной версией для небольших приложений.

Прошлой ночью я реализовал std::initializer_list в соответствии со спецификацией, и у меня были проблемы с тем, чтобы заставить его работать, я искал высокие и низкие ответы, чтобы оставить только утверждения о том, что это невозможно, и что для этого потребуются изменения в компиляторе сам. Ну, я решил взглянуть на текущую реализацию libstdc++, и, конечно же, моя реализация была точно такой же по дизайну, только немного отличающейся по краям, я потратил впустую бессмысленные часы, выясняя, почему реализация не работает, когда по дизайну он был точно такой же, как и у libstdc++. Прошло не больше шести часов, прежде чем я понял, что это должно быть в std пространства имен. Оказывается, реализация - это прокси для компилятора, который делает возможным initializer_list, а сам компилятор ищет класс initializer_list в namespace std.

У меня вопрос: есть ли еще какие-то библиотечные функции, о которых я должен знать, которые требуют какой-то особой магии компилятора для работы, каких-либо скрытых прокси-соединений или секретных встроенных функций компилятора для каких-либо новых функций библиотеки C ++ 11? Я хотел бы знать об этом заранее, чтобы быть готовым к тому, чтобы реализовать другие функции, зависящие от magic compiler , вместо того, чтобы тратить целый день на то, чтобы выяснить это методом проб и ошибок; который может стать утомительным и довольно раздражающим.

Спасибо.

Ответы [ 2 ]

11 голосов
/ 12 сентября 2011

Функции в <exception> в основном связаны с компилятором.

Несколько запросов <type_traits> свойств невозможно или очень трудно реализовать без помощи компилятора.Даже те, которые являются просто сложными, могут работать неправильно, если родной stdlib компилятора преуспевает из-за «обмана».И, конечно, они также будут компилироваться быстрее.

Хотя можно написать <iostream> так, чтобы cin и cout инициализировались автоматически при первом использовании, большинство компиляторов предпочитают обманывать и связывать их так, чтобысначала они находятся в статической инициализации.

<typeinfo>, конечно, должны точно соответствовать ожиданиям компилятора.

Возможно, есть еще вещи, которые я не знаю или не могу придуматьof.

Помимо "обмана" stdlib и зависимости от компилятора, компилятор может также полагаться на нестандартные функции, существующие в stdlib.Поэтому, даже если вы реализуете все стандартные функции, вам, скорее всего, придется копировать-вставлять процедуры для обхода таблиц исключений, обработки иерархии в виртуальных деструкторах и т. Д.

5 голосов
/ 12 сентября 2011

Все «магические» типы, необходимые компилятору, перечислены в их собственном специальном разделе спецификации C ++, который называется «Библиотека поддержки языков».Очевидно, что если вы реализуете стандартную библиотеку C ++, у вас должна быть удобная копия стандарта.Списки инициализаторов находятся в этом разделе, а также type_info, <cstdint>, глобальные операторы new / delete, <exception> и т. Д.

Не пытайтесь реализовать их;используйте то, что дает вам компилятор.

...