Здравствуйте, Den Raskovalov, Вы писали:
DR>Мне нужно записать в DWORD значение ноль. Как это проще всего сделать? Поиском пользовался — глухо. Не хочется писать свой велосипед. Пользуюсь Visual Studio 2005. Язык — C++.
Не знаю, как в старых версиях Windows, но под Vista есть вполне надежный и задокументированный способ -- GetFileVersionInfoSize. Просто передавай указатель на свой DWORD в третьем аргументе (lpdwHandle). Вот только не очень удобно то, что нужны еще значения для первых двух аргументов. Но, думаю, несложно будет написать класс-обертку для вызова этой функции с правильными аргументами.
Мне нужно записать в DWORD значение ноль. Как это проще всего сделать? Поиском пользовался — глухо. Не хочется писать свой велосипед. Пользуюсь Visual Studio 2005. Язык — C++.
Здравствуйте, Den Raskovalov, Вы писали:
DR>Всем привет
DR>Мне нужно записать в DWORD значение ноль. Как это проще всего сделать? Поиском пользовался — глухо. Не хочется писать свой велосипед. Пользуюсь Visual Studio 2005. Язык — C++.
Здравствуйте, pavelzuev, Вы писали:
P>Здравствуйте, Den Raskovalov, Вы писали:
DR>>Мне нужно записать в DWORD значение ноль. Как это проще всего сделать? Поиском пользовался — глухо. Не хочется писать свой велосипед. Пользуюсь Visual Studio 2005. Язык — C++.
P>Не знаю, как в старых версиях Windows, но под Vista есть вполне надежный и задокументированный способ -- GetFileVersionInfoSize. Просто передавай указатель на свой DWORD в третьем аргументе (lpdwHandle). Вот только не очень удобно то, что нужны еще значения для первых двух аргументов. Но, думаю, несложно будет написать класс-обертку для вызова этой функции с правильными аргументами.
Большое спасибо. Вполне подходит. Только не получается у ребят из MS, при всем уважении, нормальный API. Пришлось писать обертку. Ну заодно немного обобщил на любые типы. Надеюсь, пригодится:
Здравствуйте, Den Raskovalov, Вы писали:
DR>Всем привет
DR>Мне нужно записать в DWORD значение ноль. Как это проще всего сделать? Поиском пользовался — глухо. Не хочется писать свой велосипед. Пользуюсь Visual Studio 2005. Язык — C++.
DWORD устарел. Надо писать для DWORD_PTR. Учесть особенности x86 и x64 версий. Принять меры к тому, чтобы получился правильный результат при переносе Windows на BIG_ENDIAN архитектуру . В общем, я думаю, меньше чем парой сотен строк здесь не обойдешься
Здравствуйте, Аноним, Вы писали:
А> DR>Только на 32-битной платформе. А>MAXLONG_PTR вместо MAXLONG и все будет ок
Хм... А когда оно OK будет-то ?
Как я понимаю. MAXLONG_PTR это 2^64-1. В примере расписываем 4-байтниками, тут будут 8-байтники. Итого цикл на 2^64 / 8 == 2^61 итераций. Полагая на одну итерацию 10^-9 сек (что вряд ли выйдет, так как там еще exceptions handling), имеем 73 года.
Я не доживу. А Вы надеетесь ?
With best regards
Pavel Dvorkin
Re[5]: Заполнить DWORD нулями?
От:
Аноним
Дата:
18.08.08 21:44
Оценка:
PD>Как я понимаю. MAXLONG_PTR это 2^64-1. В примере расписываем 4-байтниками, тут будут 8-байтники. Итого цикл на 2^64 / 8 == 2^61 итераций. Полагая на одну итерацию 10^-9 сек (что вряд ли выйдет, так как там еще exceptions handling), имеем 73 года. PD>Я не доживу. А Вы надеетесь ?
Кстати надо подумать над распараллеливанием. Этот алгоритм легко распараллеливается на любое количество потоков. Интел обещает 80 ядерные процы, они обнулят все дворды всего за один год, что вполне приемлемо в рамках человеческой жизни.
Re[3]: Заполнить DWORD нулями?
От:
Аноним
Дата:
17.08.08 22:58
Оценка:
Здравствуйте, Den Raskovalov, Вы писали:
ммм.... я по ночам хуже соображаю.... это стеб?
Я хотел вставить это в наш проект, но .... на char'ах или short'ах вылетает ассерт.... Кажется, нужно специализировать шаблон и для них
Здравствуйте, Den Raskovalov, Вы писали:
DR>Всем привет
DR>Мне нужно записать в DWORD значение ноль. Как это проще всего сделать? Поиском пользовался — глухо. Не хочется писать свой велосипед. Пользуюсь Visual Studio 2005. Язык — C++.
Думаю, правильно будет обнулить unsigned int, затем написать класс, конвертирующий это значение в abstract_unsigned, а потом сделать static_cast в DWORD.
Но это так, краткие наброски, детали с expections и прочими подробностями могут оказаться тут совсем небезынтересными
DR>Всем привет DR>Мне нужно записать в DWORD значение ноль. Как это проще всего сделать? Поиском пользовался — глухо. Не хочется писать свой велосипед. Пользуюсь Visual Studio 2005. Язык — C++.
А-а-а-а-а, отжигаете! Автор, давай сразу об стену! Тему в хумор без вариантов
DR>Только на 32-битной платформе.
MAXLONG_PTR вместо MAXLONG и все будет ок
Re[5]: Заполнить DWORD нулями?
От:
Аноним
Дата:
18.08.08 11:04
Оценка:
PD>Как я понимаю. MAXLONG_PTR это 2^64-1. В примере расписываем 4-байтниками, тут будут 8-байтники. Итого цикл на 2^64 / 8 == 2^61 итераций. Полагая на одну итерацию 10^-9 сек (что вряд ли выйдет, так как там еще exceptions handling), имеем 73 года. PD>Я не доживу. А Вы надеетесь ?
Мммда.. не подумал. Надо пробегаться с VirtualQuery по занятым регионам.
Re[5]: Заполнить DWORD нулями?
От:
Аноним
Дата:
18.08.08 12:04
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, Аноним, Вы писали:
А>> DR>Только на 32-битной платформе. А>>MAXLONG_PTR вместо MAXLONG и все будет ок
PD>Хм... А когда оно OK будет-то ?
PD>Как я понимаю. MAXLONG_PTR это 2^64-1. В примере расписываем 4-байтниками, тут будут 8-байтники. Итого цикл на 2^64 / 8 == 2^61 итераций. Полагая на одну итерацию 10^-9 сек (что вряд ли выйдет, так как там еще exceptions handling), имеем 73 года.
PD>Я не доживу. А Вы надеетесь ?
Не надеемся... поэтому мы от злости GUID'ы уникальные генерим, чтобы никому не достались... (;
Здравствуйте, Аноним, Вы писали:
А>Кстати надо подумать над распараллеливанием. Этот алгоритм легко распараллеливается на любое количество потоков.
На любое не получится, если память общая для всех потоков.
Re[7]: Заполнить DWORD нулями?
От:
Аноним
Дата:
18.08.08 22:42
Оценка:
P>На любое не получится, если память общая для всех потоков.
Вот, оптимизированный вариант. Быстро обнуляет все DWORDы в указанном процессе. Масштабируется на любое количество процессоров.
P>>На любое не получится, если память общая для всех потоков. А>Вот, оптимизированный вариант. Быстро обнуляет все DWORDы в указанном процессе. Масштабируется на любое количество процессоров.
Еще и отрефакторил
А>>Вот, оптимизированный вариант. Быстро обнуляет все DWORDы в указанном процессе. Масштабируется на любое количество процессоров.
Так ведь микросхемы памяти все равно только последовательный доступ поддерживают... Масштабироваться будет не очень хорошо.
Re[10]: Заполнить DWORD нулями?
От:
Аноним
Дата:
19.08.08 10:34
Оценка:
А>>>Вот, оптимизированный вариант. Быстро обнуляет все DWORDы в указанном процессе. Масштабируется на любое количество процессоров. P>Так ведь микросхемы памяти все равно только последовательный доступ поддерживают... Масштабироваться будет не очень хорошо.
С чего бы это? Память просто достается/пишеться cache line'ами, которые уже сами могут сбрасываться в любом порядке. А у меня каждый поток пишет в свой регион.. Хотя конечно стоит подумать о выравнивании по границе стека, но это только если профайлер покажет что это и есть узкое место алгоритма
Re[11]: Заполнить DWORD нулями?
От:
Аноним
Дата:
19.08.08 11:15
Оценка:
А>С чего бы это? Память просто достается/пишеться cache line'ами, которые уже сами могут сбрасываться в любом порядке. А у меня каждый поток пишет в свой регион.. Хотя конечно стоит подумать о выравнивании по границе стека, но это только если профайлер покажет что это и есть узкое место алгоритма
Хм хм хм... VTune посоветовал писать блоками по 2 мб..
Здравствуйте, Den Raskovalov, Вы писали:
DR>Всем привет
DR>Мне нужно записать в DWORD значение ноль. Как это проще всего сделать? Поиском пользовался — глухо. Не хочется писать свой велосипед. Пользуюсь Visual Studio 2005. Язык — C++.
Для начала следует выяснить что именно понимается под DWORD.
Возможно под тем DWORD ом хранится число, а возможно указатель. Поэтому могут требоваться различные типы DWORDов: DWORD, DWORD64, DWORD_PTR. Если под DWORDом поинмается дескриптор, то на самом деле там может быть как DWORD (или, что в данном случае то же самое, LONG), так и указатель на структуру.
Для повышения инкапсуляции хендлов могут быть использованы даже не указатели на структуры, а собственно структуры.
Язык С++ предоставляет шаблоны для реализации высокоуровневых абстракции, что позволяет составлять обобщённые алгоритмы, работающие с различными типами данных, в том числе и типами, разработанными после составления этих алгоритмов. Компилятор в Visual Studio 2005 предоставляет дополнительные расширения, упрощающий реализацию шаблонов. Так, подпрограмма для обнуления DWORD может быть реализована следующим образом:
Кстати, буквально "double word" означает "двойное слово", поэтому размер "настоящего" DWORD зависит от разрядности процессора и равен 64 битам на 32разрядном процессоре. Реализации DWORD из windows.h однако имеют другой размер — по историческим причинам.
Здравствуйте, Den Raskovalov, Вы писали:
DR>Всем привет
DR>Мне нужно записать в DWORD значение ноль. Как это проще всего сделать? Поиском пользовался — глухо. Не хочется писать свой велосипед. Пользуюсь Visual Studio 2005. Язык — C++.