Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2013, 18:06   #21
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
ну может она и 256 битная.
Шина адреса, не восми битная, просто адреса на неё выдаются в кратости одного байта. разрядность регистров современных процессоров составляет 32, 64 бита. Но сегментация памяти в 256 байт принята исходя из совместимости с 8-и разрядными процами. Дибилизм - согласен, но ничего с этим поделать не могу.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 12.01.2013 в 18:09.
Smitt&Wesson вне форума Ответить с цитированием
Старый 12.01.2013, 19:16   #22
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Память, в проце, разбита на сегменты 256 байт.
Полная чушь. Память у операционки выделяется через VirtualAlloc блоками по 64К. Привилегии блоков (чтение, запиь, выполнение) меняется страницами по 4К. Никаких других системных ограничений к размерам блоков нет. malloc обычно выделяет память кратной на sizeof(void*). Для других выравниваней есть _aligned_malloc. Все сказанное про malloc относится к библиотеке MSVC. Другие компиляторы могут иметь другие ограничения, вплоть до идиотизма округлять любой блок на 256 байт. ОС ограничивает только страницы в 64К и 4К, никаких других ограничений нет.

Процессор выдает адреса кратные 4 (младшие два бита нули) или 8 (для х64, младшие 3 бита). Все попытки считать с невыравненного адреса на всех нормальных процессорах приводять к исключению а на Intel - к двум операциам считывания. Можете поексперементироваь с SetErrorMode(SEM_NOALIGNMENTFAULTEX CEPT).

Все динамические объекты создаются через new. Другого способа нет - конструктор объекта нельзя вызвать напрямую (чего не скажеш о деструкторе). Сам по себе оператор new может использовать что угодно - обычно используется malloc но это вовсе не обязательно.
waleri вне форума Ответить с цитированием
Старый 12.01.2013, 20:19   #23
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Даже укценетировать не стал, - жуть. Я разрабатывал эти системы, я говорю, что если 2+2 = 4, а мне говорнят, что 2*2 равно 4. Ужас.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 12.01.2013, 20:44   #24
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

2 Smitt&Wesson

как и многие тут, я слегка оху..ваю от прочитанного.

сегментная модель памяти уже давно канула в лету, нынче везде только flat адресация. подсистема управления памяти процов умеет нарезать память кусками, которые называются страницами, страницы размером 4096 байт уже давно здесь, нынче находят применение страницы размером 2 МБ и 1 ГБ.

VirtualAlloc выделяет память размером кратным выбранному размеру станицы. цифра 64К называется granularity, и выбрана с целью оптимизации производительности при трансляции виртуальных адресов.

и если подумать, то malloc еще жив, особенно _aligned_malloc.

Последний раз редактировалось f.hump; 13.01.2013 в 00:40. Причина: протупил
f.hump вне форума Ответить с цитированием
Старый 12.01.2013, 20:55   #25
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от 220Volt Посмотреть сообщение
Я хочу выделять память для процесса в участке виртуальной памяти, который потом буду проецировать в другом процессе, поэтому нужен полный контроль.
Псевдокод, нужно дописать все нужные параметры.

#include <new>
#include <windows.h>

void* pv = VirtualAlloc(1234);
CMyObject* ptr = new (pv) CMyObject;
....
ptr->~CMyObject();
VirtualFree(pv);

Только создание объекта в данном месте не гарантирует, что код будет там же.
waleri вне форума Ответить с цитированием
Старый 12.01.2013, 21:18   #26
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Да меня это, как-то, не напрягает. Я умею работать с адрессацие кратной 2^n, и мне пофиг, каккие там кластеры использут, те или иные программёры, это их дело.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработка оболочки для UPX для своих нужд Ёжик в тумане Общие вопросы Delphi 9 08.08.2012 12:04
Ограничение/выделение памяти для приложений(программ) gekap404 Win Api 1 13.03.2012 14:30
Выделение памяти для строк virtuhay266 Общие вопросы C/C++ 4 05.12.2011 23:52
Выделение диапазона адресов для окна памяти платы ISA Veri Общие вопросы C/C++ 1 27.09.2011 14:20
Выделение памяти в функции для переданных параметров LinuxUser Общие вопросы C/C++ 1 12.11.2007 19:21