
제 멘탈 정상영업 합니다...?

| 구분 | 32비트 시스템 | 64비트 시스템 |
|---|---|---|
| 주소 공간 | 4GB (2³²) | 18EB (2⁶⁴, 이론적) |
| 포인터 크기 | 4바이트 (32비트) | 8바이트 (64비트) |
| 정수 크기 | int: 4바이트 | long: 8바이트 (보통) |
| 메모리 접근 | 4바이트 단위 접근 | 8바이트 단위 접근 |
+--------------------+ ← HDRP(bp) (bp - 4)
| Header (4B) |
+--------------------+ ← bp (Payload 시작)
| PRED 포인터 (8B) | ← *(void **)(bp)
+--------------------+
| SUCC 포인터 (8B) | ← *(void **)((char *)(bp) + 8)
+--------------------+
| (Padding) |
+--------------------+ ← FTRP(bp) (푸터)
| Footer (4B) |
+--------------------+
bp + 8을 더해야 할까?기존 32비트 환경에서 작성된 코드:
#define GET_SUCC_FREEP(bp) (*(void **)((char *)(bp) + 4)) // ❌ 32비트 전용
bp + 4 위치.bp + 4는 PRED 포인터의 뒷부분과 SUCC 포인터의 앞부분을 잘못 읽음.#define GET_SUCC_FREEP(bp) (*(void **)((char *)(bp) + 8)) // ✅ 64비트 기준
#define DSIZE 8 // 포인터 크기 (8바이트)
#define GET_PRED_FREEP(bp) (*(void **)(bp)) // PRED 포인터
#define GET_SUCC_FREEP(bp) (*(void **)((char *)(bp) + DSIZE)) // SUCC 포인터
#define SET_PRED_FREEP(bp, ptr) (*(void **)(bp) = (ptr)) // PRED 설정
#define SET_SUCC_FREEP(bp, ptr) (*(void **)((char *)(bp) + DSIZE) = (ptr)) // SUCC 설정
+4와 같은 32비트 기준 코드를 사용하면 치명적인 오류 발생.-
// 시간초과 안나는 코드
num_list = num_list.sort((a, b) => a - b)
console.log(num_list.join('\n'))
// 시간초과 나는 코드
num_list.sort((arr, cur) => arr - cur);
num_list.forEach((elem) => console.log(elem));
const fs = require("fs");
const input = fs.readFileSync('input.txt').toString().split('\n');
let N = parseInt(input[0]);
let num_list = [];
for (let i = 1; i <= N; i++) {
num_list.push(parseInt(input[i]));
}
function merge_sort(arr) {
if (arr.length < 2) {
return arr;
}
const mid = Math.floor(arr.length / 2);
const low_arr = merge_sort(arr.slice(0, mid));
const high_arr = merge_sort(arr.slice(mid));
let merged_arr = [];
let l = 0, h = 0;
while (l < low_arr.length && h < high_arr.length) {
if (low_arr[l] < high_arr[h]) {
merged_arr.push(low_arr[l]);
l += 1;
} else {
merged_arr.push(high_arr[h]);
h += 1;
}
}
// 남은 요소들 추가
merged_arr = merged_arr.concat(low_arr.slice(l));
merged_arr = merged_arr.concat(high_arr.slice(h));
return merged_arr;
}
const sorted_list = merge_sort(num_list);
console.log(sorted_list.join('\n'));
const fs = require('fs');
const input = fs.readFileSync('input.txt').toString().trim().split('\n')
let N = parseInt(input[0]);
let num_list = [];
for (let i = 1; i <= N; i++) {
num_list.push(parseInt(input[i]));
}
num_list = num_list.sort((a, b) => a - b)
console.log(num_list.join('\n'))
항목 | 직접 구현 병합 정렬 | JS 내장 sort (Array.sort)
시간 복잡도 | O(N log N) | 평균 O(N log N)
내부 최적화 | 없음 (순수 JS) | 있음 (네이티브 최적화)
메모리 사용량 | 높음 (배열 복사 많음) | 최적화됨 (캐시 친화적)
알고리즘 다양성 | 병합 정렬 고정 | 상황 따라 다양한 알고리즘
작은 배열 성능 | 낮음 | 매우 높음
파이썬과 마찬가지로 V8 엔진에선 Timsort를 활용...
Segmentation 하루종일 봤던 오늘 하루가 그냥 삽질...