예제에서 move constructor가 존재하는 경우 emplace(cats.end(), "nabi") 를 쓰면, "생성자 이동이 있으므로 함수가 암시적으로 삭제되었는데 삭제된 함수를 참조하려고 한다"라는 오류가 발생합니다. 이것이 cats.size()가 cats.capacity()를 초과한 결과, 반복자 및 참조가 전부 무효화되었기 때문인 것은 이해했습니다. 그런데 copy constructor만을 사용하거나 emplace_back을 쓰면 이러한 오류가 발생하지 않던데, 왜 그런건지 궁금합니다.
@코드없는프로그래밍24 күн бұрын
이해하신 부분이 맞습니다. emplace_back()은 항상 컨테이너의 끝에 새 요소를 추가합니다. 재할당이 필요해도 끝 위치는 명확하므로 무효화된 반복자 문제가 발생하지 않습니다.
@코드없는프로그래밍24 күн бұрын
벡터가 재할당될 때, 복사 생성자만 있는 경우 다음과 같은 과정을 거칩니다: a) 새로운 메모리 공간을 할당합니다. b) 기존 요소들을 새 메모리 공간으로 복사합니다. c) 새로운 요소를 추가합니다. d) 기존 메모리를 해제합니다. 과정에서 복사 생성자는 각 요소의 새로운 복사본을 만들기 때문에, 기존 객체나 포인터에 의존하지 않습니다. 따라서 기존 반복자나 참조가 무효화되어도 새로운 객체들은 영향을 받지 않습니다. 다만 복사가 일어나기때문에 성능은 떨어집니다
@JaeyongPark-n9vАй бұрын
영상 보던 중 문득, - Mediator Pattern - Commander Pattern 두 패턴과 닮았다고 생각했어요. 좋은 영상 제작하시느라 고생하셨습니다.
@jeonghyeonkim6273Ай бұрын
와 너무 감사합니다!
@SiriciusZIAАй бұрын
영상 너무 좋은데 조회수가 이것밖에 안나오다니 ㅠㅠ 너무감사해요
@드름고-j2fАй бұрын
좋은 정보 감사합니다. 이해가 잘 되게 설명해주셔서 도움이 많이 되었습니다.
@오늘의추천-s8nАй бұрын
설명을 진짜 잘하세요! 감사합니다.
@minsookang7950Ай бұрын
감사합니다 운영자님!
@황정연-x9uАй бұрын
코테를 풀다가 시간 복잡도에서 계속 걸려서 찾다보니 여기까지 왔네요.. 정말 다행입니다.! 다만 제가 쓰는 자바스크립트는 테스트 환경에서 heapq를 임포트가 불가능한지라..ㅠㅠ
@miumpre2839Ай бұрын
const char*로 받아도 3가지 타입에 대해서 추가 공간할당없이 레퍼런스로 받을수있는데 string_view의 기능을 사용안한다면 const char*이 더 좋은가요?
@사물탕Ай бұрын
patience 가 100이고, i를 10의 배수일 때마다 val_loss를 계산하는 거면, 결국 1000번(10 x 100 )의 트레이닝동안 val loss가 감소하지 않을 때 조기종료가 일어나는 게 맞나요?
@정현찬-g3n2 ай бұрын
책을 보고 cuda 공부하려고 하는데(예제로 배우는 cuda 프로그래밍, cuda 기반 gpu 병렬 처리 프로그래밍), 외장그래픽카드 없는 (ryzen5) 일반 노트북에서 실습 가능한가요? 그래픽카드가 있는 컴퓨터에서만 실습 가능한가요?
@코드없는프로그래밍2 ай бұрын
Cuda를 지원하는 엔비디아 gpu가 필수입니다
@정현찬-g3n2 ай бұрын
@@코드없는프로그래밍 혹시 코랩으로 실습 가능할까요?
@코드없는프로그래밍2 ай бұрын
Colab은 어렵고 aws nvidia gpu instance면 가능합니디. 한시간에 약 900원정도입니다
@정현찬-g3n2 ай бұрын
@@코드없는프로그래밍 답변 감사합니다
@jhjh66122 ай бұрын
이 분야 공부하는 대학생인데, 너무 이해가 잘됩니다!! 좋은 강의 감사합니다!!!
@사물탕2 ай бұрын
디코더 영상 올라오는 날은 제 생일이에요
@하하-w7j1k2 ай бұрын
좋은 강의 감사합니다. 객체의 멤버 변수를 초기화 할 때, 1. 생성자 함수를 이용해서 초기화 한다면 객체 생성 후 멤버 변수의 값이 기본값으로 저장 -> 생성자 함수를 통해서 임시 메모리에 초기화 값 저장 -> 멤버 변수에 할당된 메모리의 값이 임시 메모리에 있는 값으로 대입 2. 멤버 이니셜라이저 리스트를 이용해서 초기화 한다면 객체 생성 후 멤버 변수값을 원하는 값으로 초기화하여 효율적이라고 하셨는데 멤버 이니셜라이저 리스트를 이용해서 초기화 하는 원리는 내부 구조가 어떻게 되어있길래 기본값으로 저장하지 않고 바로 초기화가 가능한가요?
@코드없는프로그래밍2 ай бұрын
안녕하세요. 멤버 이니셜라이저 리스트가 더 효율적인 이유는 객체의 생성과 초기화를 한 번에 수행하기 때문입니다. 이는 C++ 컴파일러의 최적화와 관련이 있습니다. 멤버 이니셜라이저 리스트는 객체의 생성과 초기화를 한 번에 수행합니다.이는 C++ 컴파일러의 최적화와 관련이 있습니다. 멤버 이니셜라이저 리스트를 사용할 때의 내부 동작은 다음과 같습니다: a) 메모리 할당: 객체에 필요한 메모리가 할당됩니다. b) 직접 초기화: 멤버 변수들이 이니셜라이저 리스트에 지정된 값으로 직접 초기화됩니다. 이 과정에서 임시 객체나 추가적인 대입 연산이 필요하지 않습니다. c) 생성자 본문 실행: 이후 생성자의 본문이 실행됩니다(있는 경우).
@objects76722 ай бұрын
설명 정말 잘하시네요... 감사합니다...
@사물탕2 ай бұрын
저는 정말 전재산을 털어서 선생님의 인강을 즐을수만 있다면 Diffusion model, vit 등 배우고싶어요 진심으로요
@사물탕2 ай бұрын
Batch 내에서는 w1,w2 가 같은 건가요? 2:49
@사물탕2 ай бұрын
배치 내에서 weight는 다 share 하는거죵?
@사물탕2 ай бұрын
정발 최고의 설병
@사물탕2 ай бұрын
진짜 너무대박이에요
@jeju32672 ай бұрын
정말 감사합니다
@사물탕2 ай бұрын
정말 감사해요
@사물탕2 ай бұрын
Vision transformer 영상 부탁드랴도 될까요~!?
@코드없는프로그래밍2 ай бұрын
이번년도안에 올리겠습니다
@사물탕2 ай бұрын
@@코드없는프로그래밍 감사해요 정말 너무너무너무 좋아요
@LioJeon2 ай бұрын
강의 하나 하나가 매우 유익합니다.
@하하-w7j1k2 ай бұрын
안녕하세요, 선생님 강의를 보다가 질문이 있어 댓글 남깁니다. void storeByRRef(const std::string& s) { std::string b = std::move(s); std::cout << "s:" << s << std::endl; } int main() { std::string a = "abc"; storeByRRef(a); } 위의 코드에서 storeByRRef함수의 매개변수로 넘겨준 a는 스택의 s가 a의 주소를 참조하는데 s는 const이므로 값을 바꿀 수 없어 변수 b에 std::move함수를 이용해서 s를 R-value로 변경하여 값을 저장하려고 하지만 s는 const이므로 R-vlaue로 변경이 되지 않아 새롭게 힙에 "abc"를 깊은 복사를 하여 이 메모리의 주소를 b에 부여하는 것 아닌가요? 그렇다면 단순히 깊은 복사가 일어나는 것과 무슨 차이가 있는지 궁금합니다 즉, 위의 코드와 아래 코드의 차이점을 명확히 알지 못하겠습니다 void storeByRRef(std::string& s) { std::string b = s; std::cout << "s:" << s << std::endl; } int main() { std::string a = "abc"; storeByRRef(a); }
@코드없는프로그래밍2 ай бұрын
안녕하세요. 말씀하신데로 첫 번째 코드에서 s는 const이므로 std::move(s)를 사용해도 실제로 이동(move)이 발생하지 않습니다. 대신, 일반 복사가 수행됩니다. 두 코드 모두 실질적으로 깊은 복사를 수행하지만, 첫 번째 코드는 불필요하게 std::move를 사용하여 코드를 복잡하게 만들고 의도를 불명확하게 합니다. 두 번째 코드가 더 간단하고 의도가 명확합니다.
@이선훈-r1n2 ай бұрын
안녕하세요 좋은 강의 감사합니다. 혹시 디자인 패턴 관련한 교과서를 추천해주실 수 있나요?