목록분류 전체보기 (592)
KorSA
Memory Leak을 측정하는 방식 중 2가지를 발견하였다. 하나는 perfMon을 사용하는 방식이고, 다른 하나는 Memory Profiler를 사용하는 방식이다. [ perfMon ] 1. Task Manager 는 정확한 성능 상태를 측정하지 못한다. 사용하는 메모리가 아닌 할당된 메모리를 보여주고 그마저도 다른 프로세스에서 사용하고 있을 수 있다. 2. 프로세스에서만 사용하는 메모리를 보기 위해서 private bytes 를 보아야 한다. 이는 performance counter를 통해 볼 수 있다. 3. 메모리 릭이 발생한다면 3가지를 알아보아야 한다. 1) What ? managed 메모리 릭인지, unmanaged 메모리 릭인지 2) How ? connection object 때문인지, 파..
[ 초급 ] 1. Class 들을 묶은 개념이 Namespace이다. Namespace 들을 묶은 개념이 Assembly이다. Assembly는 DLL 형태나 EXE 형태로 존재한다. Assemly 들을 묶은 개념이 Application이다. 2. C#에서 코딩할 때 나오는 byte, short, int, long, float, double, decimal, char, bool 키워드들은 C#에서 사용하는 primitive type이다. Byte, Int16, Int32, Int64, Single, Double, Decimal, Char, Boolean 키워드들은 .NET 언어군(C#, F#, VB ..)에서 사용하는 .NET의 primitive type이다. 3. C#에서 "3.4" 와 같이 실수형 값..
#include #include #include using namespace std; const unsigned int FIRST_SIGNAL = 1983; int countK(unsigned int k, unsigned int n); struct RNG { unsigned int seed; RNG() : seed(FIRST_SIGNAL) {} unsigned int next() { unsigned int ret = seed; seed = ((seed * 214013u + 2531011u)); return ret % 10000 + 1; } }; int main() { int caseNum = 0; cin >> caseNum; unsigned int k = 0, n = 0; for (int cIter = ..
#include #include #include #include using namespace std; bool IsValid(const string str); bool IsOpenSymbol(const char target); bool IsSymmetric(const char source, const char target); int main() { int caseNum = 0; cin >> caseNum; cin.ignore(); for (int cIter = 0; cIter < caseNum; cIter++) { string brackets; std::getline(std::cin, brackets); // Process if (IsValid(brackets)) cout
식 (1983 * 214013 + 2531011) % (2^32) 에서 %(모듈러) 연산을 수행하려 하는 중 이 에러가 발생하였다. 모듈러 연산은 정수형에 대해서만 수행 가능한데, 나는 double 형으로 수행하려고 하였기 때문이다. C++ 에서 2^32 를 구하기위해 pow(2, 32)를 사용하였고, 이 리턴값이 double 형인 것이다. 일반적으로 이 에러가 발생하였다면 간단히 double형 변수가 있는 자리에 int형 변수를 넣으면 된다. 나도 단순히 double 형을 int 형으로 캐스팅하려 했는데.. 생각해보니 2^32 라는 int형 범위를 넘어버리는 것이다. 심지어 unsigned int 형 범위도 2^32 - 1 까지다. 살짝 멘붕이 왔다. % 를 쓰기 위해선 정수형으로 연산해야 하는데, 연..
[ 이슈 ] 클라이언트에서 관리하고 있는 Enum 형식의 데이터들을 서버로 전송해야되서 Enum 형을 int 형으로 캐스팅하려고 한다. 이 경우 바로 캐스팅하여 (int)EnumKind.EnumData1; 처럼 사용하면 될 것 같지만, Enum 형을 바로 int로 캐스팅할 경우 성능 저하가 발생한다. 성능저하를 최대한 줄이면서 캐스팅할 순 없을까? [ 배경 지식 ] 1. 박싱 / 언박싱 C#에서는 데이터 형식을 값 형식과 참조 형식으로 나눈다. 값 형식은 스택 영역에 데이터가 생성되고, 참조 형식은 힙 영역에 데이터가 생성되는 차이점이 있다. 박싱이란 값 형식을 참조 형식으로 변환하는 행위이고 (스택 영역의 데이터를 힙 영역으로 복사), 언박싱은 반대로 참조 형식을 값 형식으로 변환하는 행위이다. (힙 ..
Collection이 구조체(struct) 로 이루어져 있으면, Collection의 element에 접근해서 값을 변경하는 작업 시 에러가 난다. Collection의 값을 변경하려고 참조하는 순간 element의 복사가 이루어지고(element가 struct 이니까), 복사된 객체에 아무리 이런저런 수정을 하더라도 원본은 변경되지 않기 때문이다. 그래서 컴파일러가 애초에 의미없는 행동이라고 에러를 내뱉게 된다. 같은 이유로 struct로 이루어진 List도 element를 수정할 수 없다.
1. Visual Studio 버전에 따라 제공되는 C#의 버전도 다르다. 2. vcpkg는 Third Party Library들을 Visual Studio에서 쉽게 사용하게 해주는 툴이다. git clone, build 만 하면 Visual Studio가 참조하는 헤더파일, 라이브러리 경로 설정 등도 다 자동으로 해준다. 3. C# 프로젝트의 Output은 환경변수에 따라 저절로 바뀌지 않고 static으로 넣어주게끔 되어 있다... 4. 함수호출규약 - cdecl은 C/C++ - stdcall은 여러 프로그래밍 언어의 공통 표준 - cdecl, stdcall 에 따라 스택에 함수 인자 등이 쌓이는 방식이 다르다.
* 현상 : Marshaling 할 때 C#에서 out 파라미터로 보낸 string 변수를, C++ 에서 이 변수에 메모리 할당 후 C#으로 리턴을 시도하였다. 하지만 C++ 함수가 리턴되자마자 C#에서는 Heap Corruption 에러가 발생하였다. 원인을 찾아보니 C++에서 관리하는 메모리는 C++에서 할당 및 해제를, C#에서 관리하는 메모리는 C#에서 할당 및 해제를 해야 하는 것 같았다. exe 파일(C#으로 작성)과 dll 파일(C++로 작성)에서 관리하는 힙 영역은 각각의 CRT 라이브러리를 사용하고 각자의 Heap Manager를 소유하고 있다. 그래서 한 CRT 라이브러리 내에서 할당한 메모리를 포인터를 통해 DLL boundary 너머로 보내고, 다른 CRT 라이브러리에서 이 메모리를..
#include #include #include #include #define MAX_N 12 #define MAX_M 10 using namespace std; int INF = 987654321; int N, K, M, L; int before[MAX_N][MAX_N]; int semesters[MAX_M][MAX_N]; int cache[10][1 > caseNum; for (int cIter = 0; cIter > N >> K >> M >> L; #pragma region Input for (int i = 0; i > beforeNum; if (beforeNum == 0) { before..