Vladimir Simakov: Более того, ассемблерными вставками тоже очень даже пользуются.
частично забираю свои слова обратно, смотреть с 18:00 , да на асме не пишут, а правят уже скомпилированный код - тогда логично
насколько я понимаю, что делают современные компиляторы с ассемблерными вставками - это всего лишь имитация асм, т.е. не факт, что асм вставка именно в таком виде попадет в скомпилированный код, а чтобы действительно оптимизировать в асме код достаточно в дебагере переписать участки кода на асме - имхо
да че там, есть области памяти а есть указатели на области памяти, хранящиеся в других областях памяти
и дальше по иерархии хоть до бесконечности, пока мозг способен воспринимать
Ага, а еще классно получается не уследить за тем, жива ссылка или нет и залезть в давно освобожденный участок памяти, который уже другой процесс использует и все там поломать)))
Ага, а еще классно получается не уследить за тем, жива ссылка или нет и залезть в давно освобожденный участок памяти, который уже другой процесс использует и все там поломать)))
Что за сказки, такое было возможно только в Windows 3.*. Винда вас в память чужого процесса не пустит, каждый процесс работает в своей области, причем для него адресация памяти начинается с нуля, винда ему так ее представляет. И вообще, винда память выделяет только при реальной записи данных. Сделайте массив double arr[1024*1024*1024] и посмотрите, сколько памяти выделилось реально в диспетчере задач. А нисколько! Пока в массив реально писать не начнете, память не будет выделяться кусочками по 4 Кб. Даже если будете писать по рандомным индексам, все равно такими кусочками. Как винда все это виртуализирует, для меня непостижимо!
Как винда все это виртуализирует, для меня непостижимо!
неохота гуглить, но с появлением Пентиум-1 и появились у процессора дескрипторы сегментов памяти и виртуальная память, т.е. скорее всего это на уровне железа виртуализация, а Винда этим умело пользуется
Что за сказки, такое было возможно только в Windows 3.*. Винда вас в память чужого процесса не пустит, каждый процесс работает в своей области, причем для него адресация памяти начинается с нуля, винда ему так ее представляет. И вообще, винда память выделяет только при реальной записи данных. Сделайте массив double arr[1024*1024*1024] и посмотрите, сколько памяти выделилось реально в диспетчере задач. А нисколько! Пока в массив реально писать не начнете, память не будет выделяться кусочками по 4 Кб. Даже если будете писать по рандомным индексам, все равно такими кусочками. Как винда все это виртуализирует, для меня непостижимо!
Page Fault же. Исключение бдыщ - дали памяти на страницу, и не более. Это удобно и прозрачо для приложений, но приводит к фрагметации памяти. Можно выделить физическую память одним махом, если после virtualalloc вызвать virtuallock на полученный указатель. Кстати, интересная дырка, надо посмотреть, можно ли так завалить сервер.
В трёшке виртуализации не было, это другая система, не NT. Там вообще хвостов от доса было навалом, половина системных функций была навешана на int 21.
/*
* The mine_score structure describes the maximum normalized mutual information
* scores (i.e. the characteristic matrix if est=EST_MIC_APPROX, the
* equicharacteristic matrix instead). M[i][j] contains the score using a grid
* partitioning x-values into i+2 bins and y-values into j+2 bins. m and M are
* of length n and each M[i] is of length m[i].
*/typedefstruct mine_score
{
int n; /* number of rows of M */int *m; /* number of cols of M[i] for each i */double **M; /* the (equi)characteristic matrix */
} mine_score;
Далее, в ф-ии идет изменение размера матрицы М:
/*
* Returns an initialized mine_score structure. Returns NULL if an error
* occurs.
*/
mine_score *init_score(mine_problem *prob, mine_parameter *param)
{
int i, j;
double B;
mine_score *score;
if ((param->alpha > 0.0) && (param->alpha <= 1.0))
B = MAX(pow(prob->n, param->alpha), 4);
elseif (param->alpha >= 4)
B = MIN(param->alpha, prob->n);
else
goto error_score;
score = (mine_score *) malloc (sizeof(mine_score));
if (score == NULL)
goto error_score;
score->n = MAX((int) floor(B/2.0), 2) - 1; задали кол-во строк, ок
score->m = (int *) malloc(score->n * sizeof(int)); а кол-во столбцов тут чему равно? кол-ву строк?if (score->m == NULL)
goto error_score_m;
for (i=0; i<score->n; i++)
score->m[i] = (int) floor((double) B / (double) (i+2)) - 1;
score->M = (double **) malloc (score->n * sizeof(double *));
if (score->M == NULL)
goto error_score_M;
for (i=0; i<score->n; i++)
{
score->M[i] = (double *) malloc ((score->m[i]) * sizeof(double)); а здесь идет просто выделение памяти для матриы М?if (score->M[i] == NULL)
{
for (j=0; j<i; j++)
free(score->M[j]);
goto error_score_M_i;
}
}
return score;
error_score_M_i:
free(score->M);
error_score_M:
free(score->m);
error_score_m:
free(score);
error_score:
returnNULL;
}
То есть, как я понял, вся эта портянка только для выделения памяти под матрицу, но никакими значениями она не заполняется? То есть этот код можно выкинуть для mql (ну, после определения кол-во строк, и такого же кол-ва столбцов квадратной матрицы)
или все-таки матрица инициализируется какими-то значениями
typedefstruct mine_score
{
int n; /* number of rows of M */int *m; /* number of cols of M[i] for each i */double **M; /* the (equi)characteristic matrix */
} mine_score;
score->n = MAX((int) floor(B/2.0), 2) - 1; задали кол-во строк, ок
score->m = (int *) malloc(score->n * sizeof(int)); а кол-во столбцов тут чему равно? кол-ву строк?
score->M[i] = (double *) malloc ((score->m[i]) * sizeof(double)); а здесь идет просто выделение памяти для матриы М?
Далее, в ф-ии идет изменение размера матрицы М:
То есть, как я понял, вся эта портянка только для выделения памяти под матрицу, но никакими значениями она не заполняется? То есть этот код можно выкинуть для mql (ну, после определения кол-во строк, и такого же кол-ва столбцов квадратной матрицы)
или все-таки матрица инициализируется какими-то значениями
В mine_score *m - УКАЗАТЕЛЬ на int, и в коменте сказано что это массив, то есть для каждой строки разное количество столбцов, это называется "гребневый масив" не прямоугольный.
score->m = (int *) malloc(score->n * sizeof(int))
Тут просто для этого массива длин строк выделяется память, значений нет
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
да че там, есть области памяти а есть указатели на области памяти, хранящиеся в других областях памяти
и дальше по иерархии хоть до бесконечности, пока мозг способен воспринимать
Более того, ассемблерными вставками тоже очень даже пользуются.
частично забираю свои слова обратно, смотреть с 18:00 , да на асме не пишут, а правят уже скомпилированный код - тогда логично
насколько я понимаю, что делают современные компиляторы с ассемблерными вставками - это всего лишь имитация асм, т.е. не факт, что асм вставка именно в таком виде попадет в скомпилированный код, а чтобы действительно оптимизировать в асме код достаточно в дебагере переписать участки кода на асме - имхо
да че там, есть области памяти а есть указатели на области памяти, хранящиеся в других областях памяти
и дальше по иерархии хоть до бесконечности, пока мозг способен воспринимать
Ага, а еще классно получается не уследить за тем, жива ссылка или нет и залезть в давно освобожденный участок памяти, который уже другой процесс использует и все там поломать)))
Ага, а еще классно получается не уследить за тем, жива ссылка или нет и залезть в давно освобожденный участок памяти, который уже другой процесс использует и все там поломать)))
Что за сказки, такое было возможно только в Windows 3.*. Винда вас в память чужого процесса не пустит, каждый процесс работает в своей области, причем для него адресация памяти начинается с нуля, винда ему так ее представляет. И вообще, винда память выделяет только при реальной записи данных. Сделайте массив double arr[1024*1024*1024] и посмотрите, сколько памяти выделилось реально в диспетчере задач. А нисколько! Пока в массив реально писать не начнете, память не будет выделяться кусочками по 4 Кб. Даже если будете писать по рандомным индексам, все равно такими кусочками. Как винда все это виртуализирует, для меня непостижимо!
Как винда все это виртуализирует, для меня непостижимо!
неохота гуглить, но с появлением Пентиум-1 и появились у процессора дескрипторы сегментов памяти и виртуальная память, т.е. скорее всего это на уровне железа виртуализация, а Винда этим умело пользуется
Что за сказки, такое было возможно только в Windows 3.*. Винда вас в память чужого процесса не пустит, каждый процесс работает в своей области, причем для него адресация памяти начинается с нуля, винда ему так ее представляет. И вообще, винда память выделяет только при реальной записи данных. Сделайте массив double arr[1024*1024*1024] и посмотрите, сколько памяти выделилось реально в диспетчере задач. А нисколько! Пока в массив реально писать не начнете, память не будет выделяться кусочками по 4 Кб. Даже если будете писать по рандомным индексам, все равно такими кусочками. Как винда все это виртуализирует, для меня непостижимо!
В трёшке виртуализации не было, это другая система, не NT. Там вообще хвостов от доса было навалом, половина системных функций была навешана на int 21.
Не понятен такой случай:
Далее, в ф-ии идет изменение размера матрицы М:
То есть, как я понял, вся эта портянка только для выделения памяти под матрицу, но никакими значениями она не заполняется? То есть этот код можно выкинуть для mql (ну, после определения кол-во строк, и такого же кол-ва столбцов квадратной матрицы)
или все-таки матрица инициализируется какими-то значениями
...Как винда все это виртуализирует, для меня непостижимо!
Почитайте Рихтера. У него все это разжевано до боли в сердце.
SeriousRacoon:
Кстати, интересная дырка, надо посмотреть, можно ли так завалить сервер
Нельзя.
Не понятен такой случай:
score->n = MAX((int) floor(B/2.0), 2) - 1; задали кол-во строк, ок score->m = (int *) malloc(score->n * sizeof(int)); а кол-во столбцов тут чему равно? кол-ву строк?score->M[i] = (double *) malloc ((score->m[i]) * sizeof(double)); а здесь идет просто выделение памяти для матриы М?Далее, в ф-ии идет изменение размера матрицы М:
То есть, как я понял, вся эта портянка только для выделения памяти под матрицу, но никакими значениями она не заполняется? То есть этот код можно выкинуть для mql (ну, после определения кол-во строк, и такого же кол-ва столбцов квадратной матрицы)
или все-таки матрица инициализируется какими-то значениями
В mine_score *m - УКАЗАТЕЛЬ на int, и в коменте сказано что это массив, то есть для каждой строки разное количество столбцов, это называется "гребневый масив" не прямоугольный.
score->m = (int *) malloc(score->n * sizeof(int))Тут просто для этого массива длин строк выделяется память, значений нет
Для самой матрицы М
тут выделяется память для указателей строк
score->M[i] = (double *) malloc ((score->m[i]) * sizeof(double)); а здесь идет просто выделение памяти для матриы М?а тут для столбцов