Здравствуйте, Mr. None, Вы писали:
MN>Здравствуйте, Павел Кузнецов, Вы писали:
>>> Но человек задал вопрос, касающийся низкоуровневого кода, взаимодействующего с API операционной системы.
ПК>>Это твоя трактовка, не обязательно совпадающая с авторской.
MN>А кто сказал, что ваша трактовка совпадает с авторской? Автор не упомянул, что его интересуют способы зануления структур в общем виде, в том числе содержащих UDT и прочее, прочее, прочее... В вопросе автора фигурировали структуры и функции WinAPI — код который может появиться исключительно в модулях самого низкого уровня приложения для ОС Windows. В них и не пахнет ни UDT, ни конструкторами ни чем другим. При ответе же на его вопрос, вомнили всё — и связанное, и не связанное. Даже переносимость кода сюда приплели, хотя о какой переносимости кода может идти речь, когда в нём присуствует WNDCLASSEX и преславутая ZeroMemory... Если уж говорить о переносимости кода между различными компиляторами в рамках одной операционки (Windows), то вариант с ZeroMemory будет более переносим.
Самое смешное, что в этом ты абсолютно прав. Но это из серии -- исправляем дефекты реализации дефектами программмирования. Минус на минус...
>>> В таком коде фигурируют только POD-структуры, в таких случаях имеет право быть ZeroMemory или даже лучше memset — для переносимости. Для чего это надо? Хотя бы для таких хитрожопых компиляторов, которые в отличие от операцонной системы считают что null-pointer value это не 0.
ПК>>Как уже говорилось, если такой компилятор будет на такой операционке, то он как-нибудь должен будет делать соответствующие преобразования. И если ему вместо "логического" нуля подсунут "физический", полученный с помощью memset, то в ходе этих преобразований, "физический" ноль нулем быть перестанет. В случае же "обнуления" через = { 0 }, все отработает, как ожидалось, т.к. никаких сюрпризов для компилятора мы не создавали.
MN>В таком случае библиотека WinAPI тоже должна будет соответствующим образом портирована на такой компилятор и ZeroMemory должен будет работать так как и работал везде.
Ты, по-моему, всё никак не въедешь в фишку. Вот у тебя реализация. Запись
int x=int();
запишет в область памяти, оккупирванную x, некоторую последовательность байт -- платформенно зависимую. Значение x как целого числа при этом станет 0.
int x;
memset(&x,0,sizeof x);
запишет строго нулевую последовательность байт. Какое значение при этом получит x -- зависит от платформы.
Здравствуйте, Mr. None, Вы писали:
MN>Здравствуйте, Шахтер, Вы писали:
MN>>>Строго говоря функция ZeroMemory — это API-функция конкретной операционной системы и реализация компилятора тут не причём — это первое. MN>>>Второе — эта операционная система предполагает, что null-pointer value — это 0 (если быть совсем точным, то это все значения указателей, расположенных в диапазоне 0x00000000 — 0x0000FFFF). Поэтому если компилятор в качестве null-pointer value выбирает скажем 0xFFFFFFFF, любой вызов API-функции, ожадающей получение указателя проинициализированного значением null-pointer values, закончиться неудачей. Следовательно либо такой компилятор будет порождать неработоспособный код, либо надо как раз пользоваться функцией ZeroMemory, а не ={0}.
Ш>>Для обращения к функциям API придётся делать адаптеры, естественно. MN>Вот только если кто-нть обойдёт эти адаптеры — абзац выйдет... И кто в данном случае будет прав? Ведь мы не взирая на рекомендации производителя Visual Studio не использовать stl в своих проектах всё равно используем (кажись когда-то в MSDN-е было такое замечание, что stl поставляется только для совместимости с другим кодом и использовать её в новых проектах не рекоменуется).
MN>>>Инитересно, как в такой реализации будут интерпретироваться результаты вещественного типа, возвращаемые API-вызовами операционной системы? Или придётся ещё писать кучу функций типа float win32_float_to_this_magic_cpp_float(float)?
Ш>>Ага, именно так. MN>МАМА!! РОДИ МЕНЯ ОБРАТНО!!!!!
Что мешает автоматизировать этот процесс прогнав виндовые хидера через некоторый сильно упрощённый C-компилятор?
ПК>>>Как уже говорилось, если такой компилятор будет на такой операционке, то он как-нибудь должен будет делать соответствующие преобразования. И если ему вместо "логического" нуля подсунут "физический", полученный с помощью memset, то в ходе этих преобразований, "физический" ноль нулем быть перестанет. В случае же "обнуления" через = { 0 }, все отработает, как ожидалось, т.к. никаких сюрпризов для компилятора мы не создавали.
MN>>В таком случае библиотека WinAPI тоже должна будет соответствующим образом портирована на такой компилятор и ZeroMemory должен будет работать так как и работал везде.
Ш>Ты, по-моему, всё никак не въедешь в фишку. Вот у тебя реализация. Запись
Ш>
Ш>int x=int();
Ш>
Ш>запишет в область памяти, оккупирванную x, некоторую последовательность байт -- платформенно зависимую. Значение x как целого числа при этом станет 0.
Абсолютно согласен.
Ш>
Ш>int x;
Ш>memset(&x,0,sizeof x);
Ш>
Ш>запишет строго нулевую последовательность байт. Какое значение при этом получит x -- зависит от платформы.
И тут абсолютно согласен!
Я прекрасно понимаю, что memset(&x,0,sizeof(x)); забъёт участок памяти размером sizeof(x) начиная с &x нулями, но значение x при этом будет зависеть от платформы (компилятора). Ок, с первым вопросом разобрались .
Теперь переходим к следующему. Давайте представим на секунду реализацию компилятора для Win32, в которой нулевая последовательность байт не соответствует int(0). Точнее даже так int(0) представляет собой ненулевую последовательность байт. Внутри программы скомпилированной данным компилятором всё ок, но как только мы передаём такую переменную функции API всё рушиться, потому как она ожидает, что int(0) — это есть нулевая последовательность байт, поскольку она была скомпилирована другим компилятором.
Согласен — можно предположить, что подобный компилятор может позаботиться о преобразовании его int(0) в нулевую цепочку байт при передаче значения в функцию API. НО, сама Microsoft очень активно использует ZeroMemory для зануления структур в своих примерах и кодах из SDK и пр. и др. Я не думаю, что M$ пойдёт на поводу у разработчика такого компилятора и исправит все свои коды. Скорее это разработчик компилятора будет вынужден сделать так, чтобы структура занулённая с помощью ZeroMemory корректно передавалась в функции API. Таким образом имеем, в низкоуровневом коде, работающем с API вызовами WinAPI, мы смело можем использовать ZeroMemory — именно это я пытаюсь сказать вот уже вторые сутки.
Заметьте, я не утверждаю, что это правильно и только так и надо делать везде. Я только заявляю ещё раз это имеет право быть там, где это уместно — код низких уровней приложения.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Здравствуйте, Шахтер, Вы писали:
MN>>Использование ZeroMemory — это не хак а вполне корректный с точки зрения операционной системы способ зануления структуры используемой при системном вызове.
Ш>Не с точки зрения операционной системы, а в рамках конкретной платформы. В данном случае используется особенность платформы, состоящая в том, что примитивные типы данных имеют нулевое значение, представимое цепочкой нулевых байт.
И этой особенностью активно пользуются разработчики операционной системы Windows в своих исходниках, примерах, вспомогательных кодах из различных SDK. Поэтому можно предположить, что на любой платформе, на которой стоит ОС Windows ZeroMemory будет правильно занулять структуры из её API. Microsoft будет проще вставить соответствующую заплатку в операционку, чем переписать все свои сэмплы.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
> MN> Если уж говорить о переносимости кода между различными компиляторами в рамках одной операционки (Windows), то вариант с ZeroMemory будет более переносим. > > Самое смешное, что в этом ты абсолютно прав. Но это из серии -- исправляем дефекты реализации дефектами программмирования. Минус на минус...
Пример, пожалуйста. Я что-то ни одного не припомню, чтобы memset работал, а = { 0 } — нет.
Posted via RSDN NNTP Server 1.9 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
>>> Но человек задал вопрос, касающийся низкоуровневого кода, взаимодействующего с API операционной системы. > > ПК>Это твоя трактовка, не обязательно совпадающая с авторской. > > А кто сказал, что ваша трактовка совпадает с авторской? Автор не упомянул, что его интересуют способы зануления структур в общем виде, в том числе содержащих UDT и прочее, прочее, прочее...
Это называется более широкий взгляд на вопрос. Предотвращение неприятностей путем выработки хороших привычек. В самом деле, если для своих структур все равно нужно использовать = { 0 }, то зачем вообще оставлять использование ZeroMemory?
> В вопросе автора фигурировали структуры и функции WinAPI — код который может появиться исключительно в модулях самого низкого уровня приложения для ОС Windows.
Если низвести вопрос до уровня работы только с Win API — надо топать в соответствующий форум.
> Если уж говорить о переносимости кода между различными компиляторами в рамках одной операционки (Windows), то вариант с ZeroMemory будет более переносим.
Приведи конкретный пример, пожалуйста.
> В таком случае библиотека WinAPI тоже должна будет соответствующим образом портирована на такой компилятор и ZeroMemory должен будет работать так как и работал везде.
ZeroMemory и будет работать так же, как везде: будет обнулять переданный блок памяти.
Posted via RSDN NNTP Server 1.9 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
> Таким образом имеем, в низкоуровневом коде, работающем с API вызовами WinAPI, мы смело можем использовать ZeroMemory — именно это я пытаюсь сказать вот уже вторые сутки.
Уже вторые сутки тебе пытаются объяснить, что да, ты можешь использовать ZeroMemory при всех перечисленных ограничениях, но шаг влево, шаг вправо — и можно легко нарваться на неприятности. В результате возникает вопрос: зачем использовать ZeroMemory, если в общем случае есть лучшая альтернатива?
Posted via RSDN NNTP Server 1.9 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Mr. None, Вы писали:
MN>Вот только если кто-нть обойдёт эти адаптеры — абзац выйдет... И кто в данном случае будет прав? Ведь мы не взирая на рекомендации производителя Visual Studio не использовать stl в своих проектах всё равно используем (кажись когда-то в MSDN-е было такое замечание, что stl поставляется только для совместимости с другим кодом и использовать её в новых проектах не рекоменуется).
Насколько я помню, речь там шла не об STL, а о старой библиотеке потоков.
А рекомендовалось использовать как раз STL :)
"Павел Кузнецов" <5834@news.rsdn.ru> wrote in message news:683866@news.rsdn.ru...
> Пример, пожалуйста. Я что-то ни одного не припомню, чтобы memset работал, а = { 0 } — нет.
Такое может случиться при инициализации объединений, первые члены которых имеют, например, плавающие типы.
>> Я что-то ни одного не припомню, чтобы memset работал, а = { 0 } — нет.
> Такое может случиться при инициализации объединений, первые члены которых имеют, например, плавающие типы.
Только в таком случае возникает вопрос: а какой из двух вариантов считать работающим? Кроме того, на платформе, где 0.0 или 0.0f представляется чем-то, отличным от последовательности нулевых байтов, memset для плавающих типов все равно использовать нельзя...
Posted via RSDN NNTP Server 1.9 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Дарней, Вы писали:
Д>Признаюсь честно, привык писать обнуление структур в таком стиле:
Д> WNDCLASSEX wcx = { 0 };
Д>Немного нагляднее и короче, чем ZeroMemory. Хоть это и небольшой хак Д>Интересно — может быть, есть какие-то аргументы против такой практики?
а если нужно будет обнуль структурку потом,
лучше уже сразу писать везде одинаково (ZeroMemory)
Здравствуйте, rsdn_avatara, Вы писали:
_>Здравствуйте, Дарней, Вы писали:
Д>>Признаюсь честно, привык писать обнуление структур в таком стиле:
Д>> WNDCLASSEX wcx = { 0 };
Д>>Немного нагляднее и короче, чем ZeroMemory. Хоть это и небольшой хак Д>>Интересно — может быть, есть какие-то аргументы против такой практики?
а если нужно будет обнуль структурку потом,да и если сделаешь членом класса
лучше уже сразу писать везде одинаково (ZeroMemory)
всегда пытаюсь решать одну залачу одним методом
Здравствуйте, Павел Кузнецов, Вы писали:
>> В таком случае библиотека WinAPI тоже должна будет соответствующим образом портирована на такой компилятор и ZeroMemory должен будет работать так как и работал везде.
ПК>ZeroMemory и будет работать так же, как везде: будет обнулять переданный блок памяти.
И при передаче обнулённой таким образом структуры в любую функцию WinAPI все её атрибуты будут корректно трактованы как нулевые. Если это не будет исполняться, то все исходники и примеры поставляемые самой Microsoft, в которых ZeroMemory используется именно для этих целей перестанут работать. А таких очень много — в SDK только непосредственное упоминание ZeroMemory встречается в 150 cpp-файлах, а есть ещё десятка два макросов (типа RESET_THIS_MAGIC_STRUCT), в которых присутствует ZeroMemory. А ещё есть ATL и MFC и немеренное количество примеров из статей MSDN`а...
Или вы поможете Microsoft переписать все эти исходники?
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Mr. None, Вы писали:
MN>>Вот только если кто-нть обойдёт эти адаптеры — абзац выйдет... И кто в данном случае будет прав? Ведь мы не взирая на рекомендации производителя Visual Studio не использовать stl в своих проектах всё равно используем (кажись когда-то в MSDN-е было такое замечание, что stl поставляется только для совместимости с другим кодом и использовать её в новых проектах не рекоменуется).
J>Насколько я помню, речь там шла не об STL, а о старой библиотеке потоков. J>А рекомендовалось использовать как раз STL
Кстати может быть... Можете точную цитату дать...
Я умею признавать свои ошибки, когда действительно неправ .
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Здравствуйте, Павел Кузнецов, Вы писали:
>> А кто сказал, что ваша трактовка совпадает с авторской? Автор не упомянул, что его интересуют способы зануления структур в общем виде, в том числе содержащих UDT и прочее, прочее, прочее...
ПК>Это называется более широкий взгляд на вопрос.
Более широкий взгляд на вопрос:
— Папа, откуда беруться дети?
— Ну, сынок, сначала были динозавры...
Шутка .
ПК>Предотвращение неприятностей путем выработки хороших привычек. В самом деле, если для своих структур все равно нужно использовать = { 0 }...
Если уж на то пошло, то для своих структур нужно использовать конструкторы...
ПК>то зачем вообще оставлять использование ZeroMemory?
1. Скажите пожалуйста, когда вы пишете под Windows, в частности код непосредственно контактирующий с API-вызовами, вы всегда используете только типы C++ (short int, long int) или иногда у вас проскакивают виндовые WORD и DWORD?
2. Для 64-битной платформы ZeroMemory уже объявлена не как макрос на memset, а как полноценная функция API (RtlZeroMemory) очевидно на это есть какие-то причины. Не удивлюсь, что вслед за этим выйдет "указ" Microsoft о том, чтобы ряд системных структур, например тех, память под которые выделяется в недрах ядра, обнулять только с её помощью.
>> В вопросе автора фигурировали структуры и функции WinAPI — код который может появиться исключительно в модулях самого низкого уровня приложения для ОС Windows.
ПК>Если низвести вопрос до уровня работы только с Win API — надо топать в соответствующий форум.
Как часто вы переносите вопросы касающиеся Win API, но попадающие сюда в соответствующий форум? Регулярно! Люди склонны ошибаться или их метод мышления в отношении структурирования данных может отличаться от вашего. А некоторые вопросы, как этот, вообще стоят на пограничных террирториях.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Здравствуйте, Блудов Павел, Вы писали:
БП>Здравствуйте, Mr. None, Вы писали:
MN>>Или вы поможете Microsoft переписать все эти исходники?
БП>Вот, пожалуйста, не приводите Microsoft как образчик хорошего кода. БП>Все, что живет в UserMode писано довольно дешевыми кодерами.
А я и не привожу... Стрелял бы всех этих программеров через одного...
Но факт остаётся фактом — большинство кода живёт уже второй десяток лет и регулярно пополняется новым, причём с теми же фишками (в частности использование ZeroMemory для зануления структур). В данном случае M$ сама попалась в свою ловушку монополиста — они обязаны будут поддерживать совместимость своего корявого кода, дабы не переписывать его заново, поэтому и нам беспокоиться нечего.
БП>Другое дело — ядро. Очень, очень качественная вещь. Линуксоидам БП>еще пахать и пахать, пока что-то лучшее получится.
БП>Так вот, поиск по DDK находит сплошь и рядом, как {0}, так и RtlZeroMemory.
так и RtlZeroMemory
Стало быть даже в ядре его используют...
БП>Вот в 2.6 Линуксе как-то не любят {0}. Наверное, есть все-таки кривые компиляторы, БП>на которых это не работает.
Именно об этом и сказал Аноним породив этот флейм
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
> ПК> для своих структур все равно нужно использовать = { 0 }... > > Если уж на то пошло, то для своих структур нужно использовать конструкторы...
Это далеко не всегда возможно. Например, структура, помещенная в union, не может иметь конструкторов. Есть и еще случаи, когда наделять структуру конструкторами просто нельзя.
> ПК>то зачем вообще оставлять использование ZeroMemory? > > 1. Скажите пожалуйста, когда вы пишете под Windows, в частности код непосредственно контактирующий с API-вызовами, вы всегда используете только типы C++ (short int, long int) или иногда у вас проскакивают виндовые WORD и DWORD?
Это к обсуждаемому вопросу никакого отношения не имеет — увод разговора в сторону.
> 2. Для 64-битной платформы ZeroMemory уже объявлена не как макрос на memset, а как полноценная функция API (RtlZeroMemory) очевидно на это есть какие-то причины. Не удивлюсь, что вслед за этим выйдет "указ" Microsoft о том, чтобы ряд системных структур, например тех, память под которые выделяется в недрах ядра, обнулять только с её помощью.
Снова "общефилософские" рассуждения о возможных вариантах развития будущего вместо четких технических аргументов. Впрочем, отвечу: не выйдет такого "указа". Иначе придется переписать очень много кода самой Windows, в котором — сюрприз? — = { 0 } вполне себе используется.
В общем, до появления новых технических, нефилософских, аргументов я свое участие в данной теме сворачиваю.
Posted via RSDN NNTP Server 1.9 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен