LINUX.ORG.RU

В каком порядке вызываются деструкторы объектов при разрушении кадра стека?

 ,


0

4

Вот есть код

#include <stdio.h>

struct A{
	int x;
	~A(){ printf("%d\n", x); }
};

int main(int argc, const char **argv){
	A a1; a1.x = 1;
	A a2; a2.x = 2;
	return 0;
}
Всегда ли будет вывод
2
1
это гарантируется стандартом?

★★★★★
Ответ на: комментарий от peregrine

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

_Форматированный_ ввод/вывод удобнее в стиле Си — как минимум потому что стримы дико многословны. А форматированный ввод с их помощью как-то вообще не особо возможен.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от peregrine

Простейшая задачка для потоков. Имеем 6 элементный массив байт - mac-адрес Я хочу его вывести в формате

XX-XX-XX-XX-XX-XX

шестнадцатеричный формат, большие буквы и естественно если байт равен 1, то хочу увидеть 01, а не 1.

ПРОСТЕЙШАЯ задача на форматный вывод. Пример на плюсовых стримах в студию

Dudraug ★★★★★
()
Последнее исправление: Dudraug (всего исправлений: 1)
Ответ на: комментарий от intelfx

Только не надо путать си-стиль и си рантайм и смешивать их. :)

Про неудобство стримов Александреску еще в 2005-м писал:
https://erdani.com/publications/cuj-2005-08.pdf

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от invy

В данном контексте это одно и то же. Форматированный I/O в стиле Си (и только он) — это такой, который использует функции из libc.

про неудобство стримов

И о чём тогда вообще речь?

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

это такой, который использует функции из libc.

Не, мало того что оно небезопасное, так оно еще и тормозное (по сравнению с cppformat) :D

invy ★★★★★
()
Ответ на: комментарий от intelfx

Ну, оно понятно. Я не говорил, что невозможно. Но уже многословно. А если еще не использовать using namespace std, то вообще кошмар. Формат printf тут намного симпатичнее и очевиднее смотрится. Разве нет?

Dudraug ★★★★★
()
Ответ на: комментарий от invy

Одно тормозное, другое стрёмное и неудобное.

Нужен __builtin_printf(), который парсит формат-строку в компайл-тайме силами компилятора.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Но есть же удобные и быстрые библиотеки, зачем продолжать упарываться printf'ом? Ты же про опцию компилятора -I знаешь, да? :)

invy ★★★★★
()
Ответ на: комментарий от Gvidon

Единственное исключение, которое я знаю, — это порядок разрушения объектов в контейнерах,

Не исключение, а всё правильно. Товарищ по ссылке на SO выше правильно заметил что объекты в куче этому правилу не подлежат(пользовательский алгоритм сам решает когда и что ему не нужно), а контейнер - куча(как правило).

FeyFre ★★★★
()
Ответ на: комментарий от FeyFre

Куча тут ни при чём. Порядок разрушения локальных объектов (т. е. вызова top-level деструкторов) действительно определён, но что будет делать внутри себя деструктор контейнера — известно только ему.

Он запросто может хранить данные на стеке (т. е. внутри себя), но вызывать деструкторы хранимых объектов, скажем, в обратном порядке.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 4)
Ответ на: комментарий от FeyFre

Тем не менее, если ты делаешь

MyType* dynamicArray = new MyType[100];

delete [] dynamicArray;

то порядок вполне определён и соответствует ожидаемому. Вектор задумывался как обобщение массивов, но порядок может быть любым. Это не очевидно и противоречит принципу наименьшего удивления.

Gvidon ★★★★
()
Последнее исправление: Gvidon (всего исправлений: 2)
Ответ на: комментарий от intelfx

что будет делать внутри себя деструктор контейнера

Да, да. Это мы уже отошли от темы. Топиккастера это не интересует, предлагаю замять :)

FeyFre ★★★★
()
Ответ на: комментарий от Dudraug

ОК. Жду от вас примера на сишке.

#include <iostream>
#include <boost/format.hpp>

int main()
{
	unsigned char mac[6];
	mac[0]=0x0;
	mac[1]=0x1D;
	mac[2]=0x72;
	mac[3]=0x1F;
	mac[4]=0xFF;
	mac[5]=0x9A;
	boost::format fmt("%02X:%02X:%02X:%02X:%02X:%02X");
	for (int i = 0; i != 6; ++i)
		    fmt % static_cast<unsigned int>(mac[i]);
	std::cout << fmt << std::endl;
}
peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Я бы хотел че нить вроде

...("%02X:%02X:%02X:%02X:%02X:%02X\n", mt);
или даже
join(":", ...("%02X", mt))+"\n";

Как то много букв в этом вашем бусте топтать приходиться....

AIv ★★★★★
() автор топика
Ответ на: комментарий от peregrine

Пример на плюсовых стримах в студию

boost::format

Что-то пошло не так...

А ты глянь, что внутри boost::format.

Я гляжу на то, что ты написал. Стримов там нет.

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.