월 22,000원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
복사생성자
루키스님 안녕하세요. 복사생성자에 대해 궁금한 점이 있어 문의 남깁니다.Knight knight = Kngith(); 이렇게 선언할때에는 어떤 생성자가 호출이 되는 건가요?제가 생각한 내용은 다음과 같습니다1. Knight() 를 통해 임시 객체를 만든다 -> 기본생성자 호출금방 기본생성자를 통해 만들어진 Knight의 임시객체를 knight에 대입한다.3. Knight knight는 복사생성자를 호출하여 임시객체를 복사한다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
main이나 endl 부분이 주황색으로 표시된건 어떻게 하나요
main이나 endl 부분이 주황색으로 표시된건 어떻게 하나요
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
포인터 실습 강의를 보고 궁금한게 있습니다.
함수내부에서 변수하나를 만들어서 그 값을 반환하여 player에 대입하는 것이 속도도 느릴뿐더러 불필요한 메모리를 차지하기 때문에 그런건가요?
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
스택 오버플로우
안녕하세요,함수의 경우 스택에서 호출이 된다고 하셨는데,그러면 재귀적으로 무한루프에 빠진 코드의 경우 스택 오버플로우가 발생하는 게 맞나요?그리고 while이나 for문에서 무한 루프가 발생한 경우도 스택 오버플로우에 해당되나요?또 힙 오버플로우는 어떤 경우에 발생하는지 궁금합니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
반환타입, 매개변수타입
루키스님 안녕하세요. 연산자 오버로딩 부터 리스트 구현하는 부분까지 고민해왔던 내용에 대해서 질문 드립니다.특정 부분에 대해서 질문이 아닌 점 참고 부탁드립니다. 제목과 같이 함수를 만들때 무엇을 기준으로 (어떠한 때에) 참조값으로 리턴을 하는지, 매개변수를 받을때 (어떠한 때에)참조타입으로 받아야할지 이런 부분들이 계속해서 헷갈립니다. 어떤 부분을 더 학습해야할까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
capacity 복사에 대해 질문있습니다.
vector 가 스택이 아닌 힙 메모리에 할당 된 상태일 때예를 들어 capacity가 10 > 15로 늘어났다면15 크기의 새로운 공간에 데이터를 복사해서 사용하게되고 기존 10의 데이터 영역은 이제 사용하지 않을텐데C#의 경우 가비지컬렉션이 사용하지 않는 메모리를 회수 가는 걸로 알고 있습니다.직접 메모리를 해제 시켜야되는 C++에서 capacity 복사로 인해 생기는 사용하지 데이터를 어떻게 처리하는 지궁금합니다.
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
고민이 있어요
저는 클라이언트 취업과정 학원을 다니면서루키스님 강의도 듣고 있습니다 학원에서는 클라 취업반이다보니c++, wapi, dx 이런 과정을 거쳐서 가는데이걸 공부한 학생들이랑 일반적으로 유니티, 언리얼 국비랑은 수준이 다르다고 그분들이 말하던데 그러면 그냥 참고 버틸까요..?솔직한 마음으로는 학원 수업 난이도도 어렵긴 하지만뭔가 계속 학원 수업을 어영부영 따라가는 느낌이 들고강사분이 작성하는 코드를 그냥 보기만하는 그런 수업이다보니이게 맞나 싶더라구요 결국 제가 부족한거죠.. 그래도 부족한 부분은 루키스님 강의들 참고하면서 클라 취업반을 끝까지 노력 해보는게 조을까요?아니면, 국비지원 6개월 정도 수업듣고 클라 취업반을 다시 따라가볼까요?(국비 듣고 작은 기업이라도 취업이 된다면, 일하면서 클라 취업반 들으려고 합니다) 이 고민이 생각보다 길어지고 있어서ㅠㅠ 꼭 도움주시면 감사하겠습니다
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
함수 포인터 주소에 대해 궁금한게 있습니다.
변수나 클래스의 포인터의 주소는스택이나 힙 영역에 저장되어 있는 데이터의 주소인데함수 포인터의 주소는 코드 영역에 있는 주소인건가요?해당 주소로 이동해서 코드를 실행해라? 라는 개념으로이해하면 되는건지 궁금합니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
엔디안 질문 드립니다
공부하던 도중에 메모리에 적재되는 순서가 이상한 거 같아서 만들어서 확인해봤습니다.확인 결과 4바이트는 순서가 정확한데 8바이트로 한번에 읽을 때 왜 저런 형태가 되는 지 궁금합니다.추가로 item 구조체에 num값과 m 값을 메모리에 적재할 때 0x0000 0003 / 0x0000 0001 이렇게 적재 됐는데 리틀 엔디안에 의하면 03 00 0000 / 01 00 0000 으로 표기돼야하는 거 아닌가 싶은데 제가 무엇을 잘못 이해하고 있는 걸까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
endl 과 \n 속도 차이 확인 중 질문
const int MILLS = 1000000;int main(){ DWORD dwStart1 = GetTickCount(); for (int i = 0; i <= MILLS; ++i) cout << "h" << '\n'; DWORD dwEnd1 = GetTickCount(); DWORD dwStart2 = GetTickCount(); for (int i = 0; i <= MILLS; ++i) cout << "h\n"; DWORD dwEnd2 = GetTickCount(); DWORD dwStart3 = GetTickCount(); for (int i = 0; i <= MILLS; ++i) cout << "h" << endl; DWORD dwEnd3 = GetTickCount(); cout << dwStart1 << ' ' << dwEnd1 << ' ' << dwEnd1 - dwStart1 << '\n'; cout << dwStart2 << ' ' << dwEnd2 << ' ' << dwEnd2 - dwStart2 << '\n'; cout << dwStart3 << ' ' << dwEnd3 << ' ' << dwEnd3 - dwStart3 << '\n';} 갑자기 궁금해서 endl 이랑 \n 속도 차이 확인해보고자 어셈블리어 확인하고 결과 값도 확인했습니다. 2번 결과가 왜 빠른지는 어셈블리어 확인하면서 << 연산자 때문이라는 것도 알았습니다. 최종적으로 1번과 3번이 큰 차이는 안나지만 대체로 1번이 더 느리던데 왜 그런가요? 검색해본 결과는 flush 차이로 \n이 더 빠르다고 하지만 반대의 결과가 나와서 궁금합니다. (어셈블리어로 확인해보려 했으나 ??로 채워진 부분도 있어 알아보기 어렵고 같은 for문에서도 어셈블리어가 다르게 적용 돼 있습니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
class에서 initialize_list Constructor 왜사용하나요?
Test라는 클래스가 있을 때 Test의 ㅑinitialize_list를 인자로받는 생성자를 왜 사용하는 것인가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
함수가 끝나는 시점에서 크래쉬가 나요!
#include <iostream> using namespace std; #include <list> //양방향 리스트, 링크드 리스트. template<class T> class Node { public: Node() : _next(nullptr), _prev(nullptr), _data(T()) { } Node(const T& value) : _next(nullptr), _prev(nullptr), _data(value) { } public: Node* _next; Node* _prev; T _data; }; template<class T> class Iterator { public: Iterator() : _node(nullptr) { } Iterator(Node<T>* data) : _node(data) { } Iterator<T>& operator++() { _node = _node->_next; return *this; } Iterator<T> operator++(int) { Iterator<T> temp = *this; _node = _node->_next; return temp; } Iterator<T>& operator--() { _node = _node->_prev; return *this; } Iterator<T> operator--(int) { Iterator<T> temp = *this; _node = _node->_prev; return temp; } T& operator*() { return _node->_data; } bool operator==(const Iterator& right) { return _node == right._node; } bool operator!=(const Iterator& right) { return !(*this == right); } public: Node<T>* _node; }; //[1]->[2]->[3]->[4]->[header]가 빈 깡통이어도 기본 template<class T> class List { public: typedef Iterator<T> iterator; List() :_size(0) { _header = new Node<T>(); _header->_next = _header; _header->_prev = _header; } ~List() { //TODO while (_size > 0) pop_back(); delete _header; } void push_back(const T& value) { AddNode(_header, value); } // [1] <-> [2] <-> 3 <->[header] // [1] <-> [2] <-> [ header ] void pop_back() { RemoveNode(_header->_prev); } iterator insert(iterator iter, T _data) { return iterator(AddNode(iter._node, _data)); } iterator erase(iterator iter) { Node<T>* target = RemoveNode(iter._node); return iterator(target); } private: Node<T>* AddNode(Node<T>* before, const int& value) { Node<T>* newNode = new Node<T>(value); Node<T>* prevNode = before->_prev; prevNode->_next = newNode; newNode->_next = before; before->_prev = newNode; newNode->_prev = prevNode; ++_size; return newNode; } Node<T>* RemoveNode(Node<T>* target) { Node<T>* prevNode = target->_prev; Node<T>* nextNode = target->_next; prevNode->_next = nextNode; nextNode->_prev = prevNode; --_size; delete target; return nextNode; } public: iterator begin() { return iterator(_header->_next); } iterator end() { return iterator(_header); } int size() { return _size; } public: Node<T>* _header; int _size; }; template<class T> void test(T); int main() { /*List<int> li; List<int>::iterator eraseIt; for (int i = 0; i < 10; i++) { if (i == 5) { eraseIt = li.insert(li.end(), i); } else { li.push_back(i); } } li.pop_back(); li.erase(eraseIt); for (auto i = li.begin(); i != li.end(); ++i) { cout << *i << endl; }*/ test(List<int>()); } template<class T> void test(T) { T li; T::template iterator eraseIt; for (int i = 0; i < 10; i++) { if (i == 5) { eraseIt = li.insert(li.end(), i); } else { li.push_back(i); } } li.pop_back(); li.erase(eraseIt); for (auto i = li.begin(); i != li.end(); ++i) { cout << *i << endl; } } 해당 코드에서 main에서 주석으로 처리한 부분은 잘 되는데 template로 작성한 펑션이 끝나면 Invalid address specified to RtlValidateHeap 크래쉬가 나는데 이유가 궁금합니다.. ㅠ
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
list #2 2:40~ 임의접근
안녕하십니까! 강의 정말 잘 듣고 있습니다!다름이 아니라 list의 임의 접근 문법이 막힌 이유에서 속도차이에 대해서 뭔가 팍!하고 와닿지 않아 질문드립니다.vector같은 경우 '연속된'주소에 데이터가 저장되기 때문에 n번째 데이터는 ++연산으로 '바로 옆주소' 로 이동하여 찾는다. 그렇기 때문에 비교적 빠르게 찾을 수 있다.하지만 list의 경우 연속되지 않는 다른 어딘가에 다음 값을 저장하고 그 주소로 가는 주소값을 들고 있는데 vector와는 다르게 일일이 '주소값을 타고 워프'를 해줘야하기 때문에 시간이 많이 걸린다. 라고 이해를 했지만 위 두 경우의 속도 차이가 문법을 막을 만큼 차이가 어마어마하게 나는 건가요?!
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
데이터 크기 질문
강의 15분 쯤 내용에서 질문 있습니다.변수 a의 주소에서 1바이트 더한 위치에 b의 주소가 있을거라고 하시면서 a 주소에다가 1을 더하셨는데, 1만 저하면 1bit가 더해진 거 아닌가요? 1바이트를 더하는건데 왜 1만 더하는건지 이해가 안됩니다 ㅠㅠ
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
예외가 throw됨: 쓰기 액세스 위반입니다. this->_data이(가) 0x1110112였습니다.
계속 제목과 같은 오류가 뜹니다 ㅠㅠ 살려주세요..#include <iostream> #include <vector> using namespace std; // vector를 만들어보자 template<typename T> class Vector { public: Vector() : _data(nullptr), _size(0), _capacity(0) { } ~Vector() { if (_data) delete[] _data; } // [ ] void push_back(const T& val) { if (_size == _capacity) { //증설 작업 int newCapacity = static_cast<int>(_capacity * 1.5); //실수에서 int로 변환하면 데이터가 잘릴수도있다 if (newCapacity == _capacity) newCapacity++; reserve(newCapacity); } // [1][2][3][] _data[_size] = val; //데이터 개수 증가 _size++; } void reserve(int capacity) { _capacity = capacity; T* newData = new T[_capacity]; //데이터 복사 for (int i = 0; i < _size; i++) { newData[i] = _data[i]; //기존에 있던 데이터를 날린다 if (_data) delete[] _data; // 교체 _data = newData; } } T& operator[](const int pos) { //레퍼런스로 만들어야 데이터를 넣을 수 있음 return _data[pos]; } int size() { return _size; } int capacity() { return _capacity; } private: T* _data; int _size; int _capacity; }; int main() { Vector<int> v; //v.reserve(100); for (int i = 0; i < 100; i++) { v.push_back(i); cout << v.size() << " " << v.capacity() << endl; } for (int i = 0; i < v.size(); i++) { cout << v[i] << endl; } cout << "-----------------" << endl; // // for (vector<int>::iterator it = v.begin(); it != v.end(); ++it) // { // cout << (*it) << endl; // } // return 0; }
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
함수 인자 관련 질문있습니다.
안녕하세요. 이번 연습 문제를 구현하다보니 문득 든 궁금증인데 검색하기가 어려워 질문 남깁니다.이전 시간에 배웠던 내용과는 별개로 함수 인자(매개 변수)에 대한 사용법 관련 질문인데요.. 질문 1) 예시로 CreatePlayer 함수를 구현할 때 반환값으로 구조체를 보내기보단, 매개 변수에 그릇(playerInfo)을 같이 보내 그 그릇에 담는 식을 사용하셨는데 이러한 이유가 있을까요? (개인의 스타일인지.. 아니면 반환값으로 보내는 것보다 더 효율적인건지..이유가 궁금합니더..) 질문 2) 함수를 만들 때 반환값을 지정해줘야 하는 경우는 알잘딱 해야하는 부분일까요? 아니면 지정된 암묵적인 룰?같은 것이 있을까요?(질문 1같은 상황이 발생했을 때 어떠한 기준으로 판단을 지어야 하는지 궁금합니다..) 함수를 만들 때 판단이 잘 서지않아 이게 경험 차이 때문인지 아니면 진짜 그냥 헷갈리는건지 구분이 안 서서 질문드립니당 ㅠ.ㅠ
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
순수 가상 함수
안녕하세요! 좋은 강의 항상 감사합니다!이번 수업에서 순수 가상 함수 내용을 다 듣고 나니, 예전에 배운 c# 인터페이스와 비슷하다는 생각을 하게 되었습니다. 그래서 실제로 c# 인터페이스와 순수 가상 함수의 동작이 비슷한 방식으로 하는지, 다르다면 어떤 차이점이 있는지 궁금합니다!( 궁금한 이유는 유니티에서 c# 인터페이스로 구현했던 부분을 c++에서는 순수 가상 함수로 구현을 하면 괜찮을 것 같다고 생각이 들었습니다. )
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
캐시 메모리에 대해 질문드립니다.
메모리에서 레지스터로 데이터를 가져갈 때예를 들어 mov rax,10 << 이런 식의 코드일 때렘 메모리에서 캐시 메모리를 거치지 않고 바로 레지스터로 데이터를 복사해서 넣는건가요?아니면 캐시 메모리에서 레지스터로 데이터가 복사되는건지 궁금합니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
temp 주소값 push 시 질문 있습니다.
안녕하세요. 대략적인 진행 방식은 어느정도 이해가 된 것 같습니다. 그런데 지역변수(temp) 할당 시에 매개변수에(&temp)값이 들어가는 부분을 도저히 찾을 수가 없네요 ㅠㅠ혹시 CreatePlayer가 호출되기 전 push eax 부분이 매개변수까지 동시에 지정이 된다는 뜻일까요?? 나머지 부분은 반복 학습을 하니 이해가 가는데 임시 저장소 생성시점만 이해가 가질 않습니다 ㅠㅠ
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
ret 질문입니다
mov eax, 11mov ebx,10call MAX; PRINT_DEC 4, ecx; NEWLINE xor rax, raxret PRINT_MSG:PRINT_STRING msgNEWLINEret MAX:cmp eax, ebxjg L1mov ecx, ebxjmp L2 L1:mov ecx, eax L2:PRINT_DEC 4, ecxNEWLINE L2에 ret을 넣지 않았는데 값은 제대로 나옵니다문제 되는 게 있을까요?그리고 ret은 단순히 함수의 끝을 나타내는 건가요?