В C/C++, почему globals и статические переменные инициализируются к значениям по умолчанию?
Почему бы не оставить его только с значениями мусора? Есть ли какие-либо особые причины этого?
Безопасность : Оставление только в памяти будет утечка информации из других процессов или ядра.
Эффективность : значения бесполезны, пока не инициализируются на что-то, и это более эффективно нулю их в блоке с развертываемыми петлями. ОС может даже нулевые страницы Freelelist, когда система в противном случае простаивает, а не когда некоторое клиент или пользователь ждет программы для начала.
Воспроизводимость : Оставление только о ценностях сделает поведение программы не повторяемую, что действительно трудно найти ошибки.
Элегантность : Это более чистый, если программы могут начать с 0, без необходимости беспокоить код по умолчанию инициализаторы.
Тогда можно удивляться, почему класс класс хранения
начинается , начнут как мусор. Ответ в два раза:
Это не так, в некотором смысле. Сама первая страница кадров стека на каждом уровне (то есть каждая новая страница, добавленная в стек), получает нулевые значения. «Мусор» или «неинициализированные» значения, которые последующие экземпляры функций на одном уровне стека видят, действительно являются предыдущими значениями, оставленными другими экземплярами метода вашей собственной программы и его библиотеки.
Там может быть квадратичный (или что-то еще) штраф производительности работы , связанный с инициализацией AUTO
(функция местных жителей) к чему-либо. Функция не может использовать ни один или весь большой массив, скажем, по любому данному вызову, и его могут быть вызваны тысячами или миллионами раз. Инициализация статики и глобал, OTOH, только должна произойти один раз.
Сопоставимый интерфейс содержит метод compeyTo (obj)
, который принимает только один аргумент и сравнивает себя с другим экземпляром или объектами того же класса.
Интерфейс Comparator содержит метод compare (obj1, obj2)
, который принимает два аргумента и сравнивает значение двух объектов из одного или разных классов.
Да, это возможно с помощью нового (ну это уже не новое) замкнутого
питателя (так как JUnit 4,5 ), который запускает все статические внутренние классы внешнего класса.
Чтобы использовать его, просто аннотируйте внешний класс с помощью @ RunWith (Enclosed.class)
и сделайте внутренние классы статическими.
@RunWith(Enclosed.class)
public class WorkerServiceTest {
public static class RaiseErrorTest extends AbstractDbUnitTest{
@Test
public void testSomething(){
}
...
}
...
}
И mvn тест
будет выполнять их.
Поскольку при надлежащем сотрудничестве ОС, 0 инициализирующих статик и глобалов может быть реализован без накладных расходов времени выполнения.
Подумайте об этом, в статическом цареме, вы не можете сказать всегда наверняка, что что-то действительно инициализируется, или что главное началось. Существует также статический init и динамическая фаза init, статический сначала сразу после динамической тех, где задают значение.
Если у вас не было обман из статики, вы были бы совершенно не могут сказать на этом этапе наверняка, если что-то было инициализировано вообще, и в короткие сроки C ++ World будет распадаться, а также базовые вещи, такие как Singletons (или любой вид динамической статической init) будет просто перестать работать.
Ответ с бюллетенями является энтузиазмом, но немного глупо. Это все смогло относится к нестатическому распределению, но это не сделано (ну, иногда, но не обычно).