Вопрос № 52834: Здравствуйте.
Меня интересуют тонкости программирования на С/С++ под 64битные процессоры. Пощупать ручками пока не имею возможности но очень уж интересно, просветите на будующее.
1) Указатели теперь 8 байтовые?
2) int 8 байтовый? как тепе...Вопрос № 52889: Как мне можно получить Vendor и Device ID устройств PCI шины (из программы или из драйвера - любое подойдёт, главное под Винду), я пробовал найти адрес BIOS32 и обратиться к нему с помощью дальнего вызова, но ничего не получилось, как впрочем и с пре...Вопрос № 52936: Привет, всем!
Как грамотно буферировать UNICODE-переменные?
Т.е. например: в - GetModuleFileNameW (0, MyModuleFileName, MAX_PATH+1); - «MAX_PATH+1» вызывает у меня смутные сомнения верно ли?
Второй пример в коде (WideString...Вопрос № 52938: Здравствуйте не могу доделать задание как определить глубину дерева(двоичное дерево)вышлите код этого модуля.или скажите где взять информациюпоэтому вопросу
структура
structTree{int
dann;TREE
*pleft;TREE
*pright;}...Вопрос № 52950: Здравствуйте, ув. эксперты! Недавно начал осваивать C++. Вопрос такой, какой самый подходящий (быстрый, удобный) компилятор для языка этого. Хочется узнать Ваши мнения, т.к. в различных источниках они расхожи.
//опыт программирования имеется//<br...
Вопрос № 52.834
Здравствуйте.
Меня интересуют тонкости программирования на С/С++ под 64битные процессоры. Пощупать ручками пока не имею возможности но очень уж интересно, просветите на будующее.
1) Указатели теперь 8 байтовые?
2) int 8 байтовый? как теперь брать 2, 4 и 8 байтовые целые?
3) Регистры 8 байтовые? Как они там называются eeax, eebx и т.д. ?
4) Как скажется на эффективности программ разбухание размера указателей?
Отправлен: 22.08.2006, 04:48
Вопрос задал: Ромка (статус: 1-ый класс)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: nazarini
Здравствуйте, Ромка!
http://www.electronics.ru/101.html - прелести 64 бит, правда тут мало что отноститса непосретственно к програмированию, но тоже интересно, для обшего развития так сказать :)
Ответ отправил: nazarini (статус: 1-ый класс)
Ответ отправлен: 22.08.2006, 05:00
Отвечает: InviZ
Здравствуйте, Ромка!
1) Да, 8-байтовые.
2) Нет. int остался 4х байтовым. 8 байтовый - __int64, как и был раньше. Но вот реализации long int отличаются - в Windows-компиляторах 4 байта. В *nix - 8 байт.
3) rax, rbx, rdx и т.п. =)
4) Странноват вопрос. 64-битные указатели обусловлены 64-битным адресным пространством, вот, в принципе, и все их отличие. Так что, если кому-то раньше не хватало 32-битного адресного пространства (гмм, а такие есть? =)), то сейчас проблем не будет.
Насчет скорости - честно говоря, не знаю. Во многом еще предстоит разбираться, в общем-то, в той же организации виртуальной памяти и прочих низкоуровневых подробностях т.д. и т.п. Пока что не имею возможности у себя все это покопать, т.к. дома пока нет 64-битной системы, только у некоторых знакомых имел возможность немного ознакомиться...
Ответ отправил: InviZ (статус: 2-ой класс)
Ответ отправлен: 22.08.2006, 05:59 Оценка за ответ: 5 Комментарий оценки: Спасибо. Насчёт 4го вопроса имел в виду: так же быстро 64 битный проц тягает эти 8 байт как и 32 битный - 4. Ведь это больше в 2 раза надо извлекать из памяти, а мощь 8 байтового указателя в массе ещё пару лет будет использоватся только наполовину.
Вопрос № 52.889
Как мне можно получить Vendor и Device ID устройств PCI шины (из программы или из драйвера - любое подойдёт, главное под Винду), я пробовал найти адрес BIOS32 и обратиться к нему с помощью дальнего вызова, но ничего не получилось, как впрочем и с прерываниями, но потом понял, что прерывания вообще не покатят в защищённом режиме, а дальний вызов блокирует винда, помогите разобраться. Мой уровень знаний: Новичок!!!
Отправлен: 22.08.2006, 13:51
Вопрос задал: Sltk (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: InviZ
Здравствуйте, Sltk!
Гмм. В общем-то можно из драйвера через MmMapIoSpace - доступ к физической памяти...
Но можно и из ring-3 через секцию \Device\PhysicalMemory (открывается с помощью NtOpenSection, только привилегий требует...).
Ну а дальше, думаю, знаете... Сканируем диапазон 0E0000h - 0FFFFFh, ищем BIOS32-каталог и т.п. Примера, к сожалению нет, могу завтра как свободен буду, накатать...
Ответ отправил: InviZ (статус: 2-ой класс)
Ответ отправлен: 22.08.2006, 14:34
Отвечает: EPDSota
Здравствуйте, Sltk!
Информацию об устройстве можно почитать с PCI шины через ее порты (см. ниже)
Обращение к портам (операции inport32 и outport32) нужно делать через драйвер, допускающий чтение-запись портов, таких как TVicHW32 (www.entechatiwan.com/tools.htm).
Приложение:
--------- Открыть глаза навстречу солнцу
Ответ отправил: EPDSota (статус: Специалист)
Ответ отправлен: 25.08.2006, 11:05
Вопрос № 52.936
Привет, всем!
Как грамотно буферировать UNICODE-переменные?
Т.е. например: в - GetModuleFileNameW (0, MyModuleFileName, MAX_PATH+1); - «MAX_PATH+1» вызывает у меня смутные сомнения верно ли?
Второй пример в коде (WideStringVar.Length()*4 + 1) - он получен в результате проб, и тоже я не уверен в его корректности!
Заранее мерси В.Скопин
PS Как я благодарен Биллу за «MS Visual Studio 2005 С#», где wchar_t просто какой-то страшный сон из средневековья, да и всякие выделения памяти...
Приложение:
Отправлен: 22.08.2006, 21:11
Вопрос задал: VovikDoc (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: estiGi
Здравствуйте, VovikDoc!
MAX_PATH+1 сомнений вызывать в общем то не должно. И достаточно просто MAX_PATH. Эта константа определяет макс. возможную длину пути к файлу в системе, что вам еще нужно?
А вот это - (WideStringVar.Length()*4 + 1) - выглядит как то странно. Выделять нужно столько, сколько нужно, а не результатом проб. Юникодный символ весит 2 байта, а чтобы не забивать себе этим голову, сущетствует оператор sizeof
hgBuffer= GlobalAlloc(GMEM_DDESHARE, w.Length() * sizeof (wchar_t) + 1);
Ответ отправил: estiGi (статус: Студент)
Ответ отправлен: 22.08.2006, 22:05 Оценка за ответ: 3 Комментарий оценки: 1. >Юникодный символ весит 2 байта Не всегда! МСДН пишет - зависит от компилятора; Борланд – «A wchar_t type is the same size, signedness, and alignment requirement as an int type.»
2. hgBuffer= GlobalAlloc(GMEM_DDESHARE, w.Length() * sizeof (wchar_t) + 1); Это, я пытал - "Вне памяти"!
Отвечает: Melamed
Здравствуйте, VovikDoc!
Так как символ в юникоде символы могут занимать как 2 байта (кодировка UCS-2), так и 4 байта (кодировка
UCS-4), то на нулевой символ нужно отводить 2 или 4 байта соответственно. Поэтому
в Вашем случае сомнительную строку следует записать так:
Ответ отправил: Melamed (статус: 3-ий класс)
Ответ отправлен: 23.08.2006, 00:31 Оценка за ответ: 5 Комментарий оценки: Да затупил! Но всё таки может поверить тов. Борланду: (w.Length()+1) * sizeof (int)
Отвечает: InviZ
Здравствуйте, VovikDoc!
Ну, вообще-то в Windows всегда используется UCS-2 (UTF-16LE).
wchar_t поэтому должен занимать 2 байта... В LinuxUnix - 4.
В Visual C++ во всяком случае, он занимает 2 байта, и это ясно написано в MSDN.
А вообще если есть сомнения, можно использовать определенный в виндовых header'ах WCHAR.
А w.Length()*sizeof (wchar_t) + 1 - он и не будет работать.
Все эти "+1" необходимы для того, чтобы хранить нулевой символ конца строки. А юникодовый L'
Ответ отправил: InviZ (статус: 2-ой класс)
Ответ отправлен: 23.08.2006, 06:48
Вопрос № 52.938
Здравствуйте не могу доделать задание как определить глубину дерева(двоичное дерево)вышлите код этого модуля.или скажите где взять информациюпоэтому вопросу
структура
structTree{int
dann;TREE
*pleft;TREE
*pright;}
Отправлен: 22.08.2006, 21:25
Вопрос задал: Agp200431 (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 5)
Отвечает: Www2
Здравствуйте, Agp200431!
Нужно воспользоваться рекурсией.
Для корня дерева вызываем так:
int depth = TreeDepth(proot);
proot - указатель на корень дерева,
depth - глубина дерева.
Приложение:
Ответ отправил: Www2 (статус: 5-ый класс)
Ответ отправлен: 23.08.2006, 06:44
Вопрос № 52.950
Здравствуйте, ув. эксперты! Недавно начал осваивать C++. Вопрос такой, какой самый подходящий (быстрый, удобный) компилятор для языка этого. Хочется узнать Ваши мнения, т.к. в различных источниках они расхожи.
//опыт программирования имеется//
Заранее благодарен.
С уважением, Брыкалин С.Н.
Приложение:
Отправлен: 22.08.2006, 22:42
Вопрос задал: SVORA (статус: Посетитель)
Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 6)
Отвечает: nazarini
Здравствуйте, SVORA!
Как на меня, самый удобный, многофункциональный и т.д. и т.п. Visual Studio 2003/2005,
лично я исользую 2003, большой плюс к нему єто MSDN(Огромный справочник и по С и по С++, и по С#, MFC и много всего другого). Так что Рекомендую !!!
Ответ отправил: nazarini (статус: 1-ый класс)
Ответ отправлен: 22.08.2006, 22:52
Отвечает: Ross
Здравствуйте, SVORA!
Лично я предпочитаю использовать Intel C++ Compiler 6.0 в связке с Microsoft Visual Studio .NET, т.к. этот компилятор создает более быстрый и компактный код чем встроенный.
Ответ отправил: Ross (статус: 1-ый класс)
Ответ отправлен: 23.08.2006, 02:12
Отвечает: InviZ
Здравствуйте, SVORA!
Под win - лучше всего Visual Studio + еще поставить Visual Assist X, хорошая тулза.
Под nix - ну, там gcc естественно. А IDE - много вариантов. Eclipse можно, к примеру.
Ответ отправил: InviZ (статус: 2-ой класс)
Ответ отправлен: 23.08.2006, 06:59
Отвечает: Mihasic
Здравствуйте, SVORA!
Касательно CodeWarrior, то про этот компилятор слышал лишь в контексте Mac OS... там он действительно лучший (по крайней мере был, но вроде apple вытесняла этот компилятор своими пордуктами, точно не знаю). Т.к. я все время сижу под виндой, то для меня лучшим компилятором является Visual C++ (пользуюсь 2003-й студией). В основном мое предпочтение продуктам майкрософт благодаря их IDE. Да и оптимизация кода там тоже неплохая. Приходилось работать под Builder'ом, но лично мне он очень не понравился. Под линуксом
писал только один раз и использовал встроенный в тот дистрибутив gcc (но выбор компилятора тогда был не главным, поэтому выбрал наиболее распространенное средство).
Ответ отправил: Mihasic (статус: 5-ый класс)
Ответ отправлен: 23.08.2006, 11:24