개발
-
VirtualAlloc()의 메모리 할당에 대해개발/C·C++ 2024. 10. 12. 20:39
VirtualAlloc()이 과거에는(?) 메모리 할당이 64KB 단위로 이루어졌던 것 같다.과거의 데이터로 학습한 Perplexity의 대답도 그렇고윈도우 시스템 프로그래밍 관련한 강의(최근에 제작된 것)에서도 관련한 내용으로 학습했다. 개인적으로 정리를 하던 와중에 정말 VirtualAlloc()으로 메모리 요청을 했을 때정말 최소 할당 값이 64KB이 궁금했고 테스트를 해봤다.현대적인 윈도우는 메모리 풀링을 하지 않고 new / delete만 써도 메모리 최적화가 잘 된다는 실무자 전언을 들었다.메모리 풀링을 하는 몇 가지 이유는 작은 메모리 공간을 요청에 대한 오버헤드가 큰 것과 작은 메모리 공간에 대한 잦은 할당과 반복이 메모리 단편화를 만들 수 있기 때문이다. 이 이야기를 들어서일까 Virtu..
-
64비트 시스템에서 메모리 정렬 경계에 대해개발/C·C++ 2024. 10. 11. 14:52
64bit 프로세서의 64bit 모드에서 메모리 동적할당을 하면 주소 값이 16바이트 정렬이 기본 값인 것 같다.struct PureNode{ int a; int b; int c;};int main(){ constexpr int ALIGN = 16; for (int i = 0; i (new PureNode()); uintptr_t node2 = reinterpret_cast(new PureNode()); uintptr_t node3 = reinterpret_cast(new PureNode()); uintptr_t node4 = reinterpret_cast(new PureNode()); uintptr_t node5 = reinterpret_cast(new PureNode()); ASSERT_C..
-
포인터 붕괴와 붕괴가 아닌 것개발/C·C++ 2024. 9. 28. 23:18
int형 2차원 배열을 선언한다.int buf[100][100]; 다음 둘의 주소 값이 같을까?cout 정답. O.2차원 배열의 첫 번째 행의 시작 주소를 가리킨다.auto를 이용해서 타입 확인을 해보면 타입이 다르다. 주소값은 같은데 타입이 다르다?무슨 의미일까. buf[0]은 사실상 int[100]의 시작 주소이므로 int* 타입으로 붕괴된다.문제는(?) &buf[0]인데, 이 표현식은 행 전체를 &으로 묶는 효과가 생긴다.타입은 (int*)[100]이 된다. 100개의 정수 배열에 대한 포인터다.조금 풀어서 이야기 하보면, buf[0]이 1차원 배열의 시작 주소를 가리키는데 이 앞에 주소 연산을 붙이니 1차원 배열 단위의 주소 연산을 할 수 있게 된다는 거다.코드로 확인해보자.auto p1 = ..
-
인터넷 브라우저가 최초 실행 시 로딩이 긴 경우 해결법개발/etc 2024. 9. 25. 12:03
언제부턴가 브라우저 최초 실행 시 혹은 크롬 프로그램을 전부 종료했다가 새로 열 때 어느 사이트이든 간에 최초 페이지가 로딩이 매우 길어지는 현상이 있었다. 정말 거지 같았고, 몇 년 전에 구글링을 해도 뚜렷한해결법이 나와 있지 않아서 그냥 몇 년 간 적응하며 살다가 얼마 전에 다시 검색을 하니까 방법을 찾을 수 있었다. 이 기능이 영미권에서는 필요한지 모르겠지만, 개인적으로는 정말 이해가 안 가는 기능이라고 생각한다. 디폴트로 '끔'이 설정되게 하든가, 어떤 경로로든 설정하는 화면도 보여주면 안 된다고 생각한다. 아마 안 그러다 갑자기 그랬으니 업데이트 과정에서 설정된 것 같다. 어차피 관련 기능을 아는 사람들은 알아서 찾아서 설정할테니 노출시키는 건 굉장히 바보 같은 짓이다. 인터넷 사용 환경이 안 ..
-
[와이어샤크] Null/Loopback 인터페이스개발/네트워크 2024. 9. 23. 23:12
루프백으로 패킷을 보는데 데이터 없이 헤더 정보만 오가는데 데이터 길이가 44bytes였고 살펴 보니 Null/Loopback이라는 4bytes 크기의 정보가 맨 앞에 있는 것이 확인됐다. 퍼플렉서티에게 물어보니 로컬 시스템에서 패킷을 캡처할 때 사용되는 거라고 한다. 다음은 설명 전문.Null/Loopback 헤더4바이트 헤더: 이 헤더는 패킷의 링크 계층 프로토콜을 식별하기 위해 사용됩니다. 여기서 "Family: IP (2)"는 IPv4 패킷임을 나타냅니다.02 00 00 00: 이 값은 IP 패밀리를 나타내며, Wireshark에서 이를 통해 패킷이 IP 프로토콜을 사용하고 있음을 식별합니다.역할 및 중요성로컬 통신: Null/Loopback 헤더는 로컬 호스트 내에서 통신할 때 사용되며, 실제 ..
-
덧셈 연산 어셈블리 코드 간단 분석개발/C·C++ 2024. 9. 7. 00:29
다음 코드를 어셈블리로 봐보자. for (int i = 0; i 00007FF6993C57AA mov rax,qword ptr [counter] 00007FF6993C57B1 mov eax,dword ptr [rax] 00007FF6993C57B3 inc eax 00007FF6993C57B5 mov rcx,qword ptr [counter] 00007FF6993C57BC mov dword ptr [rcx],eax 1. mov rax, qword ptr [counter]- counter 변수의 주소값을 rax 레지스터가 담는다- 주소이기 때문에 8바이트를 읽어야 하므로 qword ptr이 사용된다2. mov ea..
-
std::transform()에 대한 간단한 고찰개발/C·C++ 2024. 9. 4. 22:21
C++ 문법에 대해 살펴보다가 재미있는 코드가 있어서 간단하게 고찰해보려고 한다.공식 문서에 구현 예제까지 나와있다.헤더는 templateconstexpr //templateconstexpr // 대략적인 흐름은 원본 데이터에 대한 시작 반복자, 끝 반복자로 범위를 지정해주고결과물을 저장할 자료구조(우리 예제에서는 vector)의 시작 반복자,그리고 데이터를 가공할 방법을 안내하는 콜백 함수를 넣어주는 형태다. 앞서 잠시 언급했듯이 vector를 사용해 볼 건데,transform()에 넣을 함수 포인터는 멤버 함수에 대한 함수 포인터다.멤버 함수 포인터를 만드는 방법은 일반 함수와 조금 다르다.멤버 함수를 호출할 때 보통 "인스턴스." 혹은 "포인터 변수->"의 방식으로멤버 함수를 호출하고 필요한 인수를..
-
포인터의 타입 추론개발/C·C++ 2024. 8. 31. 12:31
templatevoid f(T* param){ cout f() 함수는 T*으로 인수를 받고 있다. const int*로 선언된 pcx 변수를 전달하면 어떤 타입으로 추론이 되는지 살펴본다. 답을 보기 전에 가능한 시나리오를 검토해보자.pcx는 const int*이니까 T는 const int가 될 수도 있고 모종의 이유로 const가 탈락한 int가 될 수도 있다. 혹은 T* 이므로 해당 타입이 가리키는 타입으로 추론될 수도 있을 것이다. 정답은 아래를 드래그 하면 된다. int 예상 가능한 시나리오의 세 번째에 해당한다고 볼 수 있다.T*은 해당 포인터 변수가 가리키는 타입을 추론한다. int형 가리키기 때문에 int로 추론된다.그렇다면 f() 함수의 파라미터가 T이면 어떨까?#include #in..