Russian Qt Forum

Qt => Вопросы новичков => Тема начата: kambala от Июль 30, 2011, 19:07



Название: QDataStream operator << записывает не сразу
Отправлено: kambala от Июль 30, 2011, 19:07
Здравствуйте. Почему оператор << у QDataStream записывает данные в свой device() не сразу же (как например cout, см. ниже), а лишь в конце команды?
Вот пример:
Код
C++ (Qt)
QByteArray saveFileContents;
QDataStream outputDataStream(&saveFileContents, QIODevice::ReadWrite);
...
quint32 fileSize = saveFileContents.size();
outputDataStream << fileSize << checksum(saveFileContents);
Раньше у меня стоял вывод этих двух значений на разных строчках, а сегодня решил сэкономить на одной и втулил оба вывода в одну. Убил часа 2 на то, чтобы понять, что так делать нельзя, поскольку вызов checksum() происходит прежде, чем QDataStream записывает fileSize, и соответственно в момент вызова checksum() новое значение ещё не успевает появиться в saveFileContents.

Попробовал сделать нечто аналогичное с cout, так тут всё происходит так, как и ожидается (хотя может и не совсем удачный пример):
Код
C++ (Qt)
int a[] = {2, 3};
std::cout << a[0]++ << " " << (a[0] + a[1]); // вывод "2 6"


Название: Re: QDataStream operator << записывает не сразу
Отправлено: Авварон от Июль 30, 2011, 21:20
Пример с сиаутом некорректен


Название: Re: QDataStream operator << записывает не сразу
Отправлено: SimpleSunny от Июль 30, 2011, 22:01
Пример с cout UB и то что вы хотите тоже, порядок вычисления аргументов у функции не определен.

Подробнее можете почитать тут
http://alenacpp.blogspot.com/2005/11/sequence-points.html


Название: Re: QDataStream operator << записывает не сразу
Отправлено: kambala от Июль 30, 2011, 22:22
спасибо, теперь понял