C 언어에 대한 질문 - 페이지 8

 
 
Igor Makanu :

예, 메모리 영역이 있고 다른 메모리 영역에 저장된 메모리 영역에 대한 포인터가 있습니다.

뇌가 지각할 수 있는 한 계층 구조를 따라 무한대까지

 
Vladimir Simakov :
또한 어셈블러 인서트도 많이 사용됩니다.

나는 부분적으로 말을 취소하고 18:00부터 시청하지만 asme로 작성하지 않고 이미 컴파일 된 코드를 편집합니다. 그러면 논리적입니다.

내가 이해하는 한, 현대 컴파일러가 어셈블러 삽입으로 수행하는 것은 asm을 모방한 것입니다. asm 삽입이 이 형식으로 컴파일된 코드에 들어가는 것은 아니지만 asma에서 코드를 실제로 최적화하려면 디버거에서 asma의 코드 섹션을 다시 작성하는 것으로 충분합니다 - IMHO


 
Maxim Dmitrievsky :

예, 메모리 영역이 있고 다른 메모리 영역에 저장된 메모리 영역에 대한 포인터가 있습니다.

뇌가 지각할 수 있는 한 계층 구조를 따라 무한대까지

예, 링크가 살아 있는지 여부를 추적하지 않고 다른 프로세스가 사용하고 있는 메모리의 오랫동안 해방된 영역에 들어가서 모든 것을 깨뜨리는 것도 멋집니다.)))

 
Vladimir Simakov :

예, 링크가 살아 있는지 여부를 추적하지 않고 다른 프로세스가 사용하고 있는 메모리의 오랫동안 해방된 영역에 들어가서 모든 것을 깨뜨리는 것도 멋집니다.)))

이것은 Windows 3.*에서만 가능했습니다. Windows는 다른 프로세스의 메모리로 들어가는 것을 허용하지 않으며 각 프로세스는 자체 영역에서 작동하며 메모리 주소 지정은 0부터 시작하므로 Windows는 그렇게 표시합니다. 그리고 일반적으로 Windows는 데이터가 실제로 쓰여질 때만 메모리를 할당합니다. 배열을 double arr[1024*1024*1024]로 만들고 작업 관리자에서 실제로 얼마나 많은 메모리가 할당되었는지 확인합니다. 그리고 전혀! 실제로 어레이에 쓰기를 시작할 때까지 메모리는 4KB 청크로 할당되지 않습니다. 임의의 인덱스에 작성하더라도 여전히 그러한 조각에 있습니다. Windows가 이 모든 것을 가상화하는 방법을 이해할 수 없습니다!

 
Alexey Volchanskiy :

Windows가 이 모든 것을 가상화하는 방법을 이해할 수 없습니다!

Google을 꺼려했지만 Pentium-1의 출현과 함께 프로세서에는 메모리 세그먼트 설명자와 가상 메모리도 있었습니다. 아마도 이것은 철 수준의 가상화이며 Winda는 이것을 능숙하게 사용합니다.

 
Alexey Volchanskiy :

이것은 Windows 3.*에서만 가능했습니다. Windows는 다른 프로세스의 메모리로 들어가는 것을 허용하지 않으며 각 프로세스는 자체 영역에서 작동하며 메모리 주소 지정은 0부터 시작하므로 Windows는 그렇게 표시합니다. 그리고 일반적으로 Windows는 데이터가 실제로 쓰여질 때만 메모리를 할당합니다. 배열을 double arr[1024*1024*1024]로 만들고 작업 관리자에서 실제로 얼마나 많은 메모리가 할당되었는지 확인합니다. 그리고 전혀! 실제로 어레이에 쓰기를 시작할 때까지 메모리는 4KB 청크로 할당되지 않습니다. 임의의 인덱스에 작성하더라도 여전히 그러한 조각에 있습니다. Windows가 이 모든 것을 가상화하는 방법을 이해할 수 없습니다!

페이지 오류. Bdysch 예외 - 페이지당 메모리를 제공했으며 그 이상은 제공하지 않습니다. 이는 애플리케이션에 편리하고 투명하지만 메모리 단편화로 이어집니다. virtualalloc 다음에 결과 포인터 에 virtuallock을 호출하여 한 번에 물리적 메모리를 할당할 수 있습니다. 그런데 재미있는 구멍이 있는데 이렇게 서버를 채울 수 있는지 확인해야 합니다.


3 루블 지폐에는 가상화가 없었습니다. 이것은 NT가 아닌 다른 시스템입니다. 일반적으로 dos에서 많은 꼬리가 있었고 시스템 기능의 절반이 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].
 */
typedef struct 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;

또한, f-ii에서 행렬 M의 크기가 변경됩니다.

/*
* 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 );    else if (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:      return NULL ; }

즉, 내가 이해하는 바와 같이 이 모든 족보는 행렬에 대한 메모리 할당 만을 위한 것이지만 값이 채워져 있지 않습니까? 즉, 이 코드는 mql에 대해 버려질 수 있습니다(정사각 행렬의 행 수와 동일한 수의 열을 결정한 후)

또는 일부 값으로 초기화된 행렬입니다.

 
Alexey Volchanskiy :

... Windows가 이 모든 것을 가상화하는 방법을 이해할 수 없습니다!

리히터를 읽으십시오. 그는 마음의 고통까지 모든 것을 씹어 먹었습니다.

심각한 너구리 :
그건 그렇고 재미있는 구멍, 우리는 서버를 이렇게 채울 수 있는지 확인해야합니다.

금지되어 있습니다.

 
Maxim Dmitrievsky :

나는 이 경우를 이해하지 못한다:

 typedef struct 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 )); а здесь идет просто выделение памяти для матриы М?

또한, f-ii에서 행렬 M의 크기가 변경됩니다.

즉, 내가 이해하는 바와 같이 이 모든 족보는 행렬에 대한 메모리 할당 만을 위한 것이지만 값이 채워져 있지 않습니까? 즉, 이 코드는 mql에 대해 버려질 수 있습니다(정사각 행렬의 행 수와 동일한 수의 열을 결정한 후)

또는 일부 값으로 초기화된 행렬입니다.

mine_score 에서 *m은 int에 대한 포인터이고 주석은 그것이 배열이라고 말합니다.

 score->m = ( int *) malloc(score->n * sizeof ( int ))

이 문자열 길이 배열에 대해 메모리가 할당되었을 뿐이며 값이 없습니다.

행렬 M 자체의 경우

score->M = ( double **) malloc (score->n * sizeof ( double *));

메모리는 여기에 문자열 포인터에 할당됩니다.

 score->M[i] = ( double *) malloc ((score->m[i]) * sizeof ( double )); а здесь идет просто выделение памяти для матриы М?

그리고 여기 열에 대해