C의 모든 타입은 C++ 기준 std::is_trivially_copyable_v를 만족함 (정확히는 C에서는 저렇지 않은 경우를 언어 차원에서 대처할 수 없다고 해야 맞음)
그래서 memcpy, memmove로 다 되니까 C에는 필요가 없는거임
C++ move 개념에서 오해하지 말아야 할게,
memcpy, memmove 되는 타입은 이동 시맨틱이 이점이 전혀 없음
std::string, std::vector 같은 것만 move하는게 더 빠른거임
int, float, int 배열/float 배열 같은 거에 move 쓰는 건 아무 의미도 없고, 컴파일러를 혼란스럽게만 할 뿐이라서 뻘짓임
그래서 memcpy, memmove로 다 되니까 C에는 필요가 없는거임
C++ move 개념에서 오해하지 말아야 할게,
memcpy, memmove 되는 타입은 이동 시맨틱이 이점이 전혀 없음
std::string, std::vector 같은 것만 move하는게 더 빠른거임
int, float, int 배열/float 배열 같은 거에 move 쓰는 건 아무 의미도 없고, 컴파일러를 혼란스럽게만 할 뿐이라서 뻘짓임
ㅇㅇ 이게 맞다
해당 댓글은 삭제되었습니다.
memmove가 move한다고 한적이 없는데
C++ trivially copyable 타입에 대해서 move는 사실상 memcpy, memmove로 이루어지니까 move의 이점이 없다는 이야기
해당 댓글은 삭제되었습니다.
너는 좀 심하게 난독인거 같은데, 본문에서는 C++ move 시맨틱 이야기하는 거임
해당 댓글은 삭제되었습니다.
string, vector 전체 move하는거 이야기임. 그냥 본문 이해도 못하고 딴소리하는거 같은데 개소리좀 그만하고 꺼져라
고아련 상대하느라 고생이 많노
포인터 갖고 있는 구조체를 move 없이 처리하면 매번 포인터가 가리키는 메모리를 딥카피하게? 딥카피 없이 그 memmove나 memcpy로 처리했으면 딥카피 필요할땐 매번 할당-복사하는 코드 더 짜넣고? 딥카피하는 함수 따로 만들면 이게 move/copy랑 다를게 없을거같은데?
무슨 말을 하고 싶은건지 잘 이해가 안되는데, 내 생각에는 구조체가 포인터 갖고 있어도 move를 별도로 만들어 줄 필요는 없음. 그냥 얕은 복사하면 포인터만 복사되니까 그 포인터가 가리키는 메모리를 딥카피할 필요 자체가 없는것임. 이 경우 신경써줘서 따로 만들어줘야 하는 거는 copy 연산이고 move 연산이 아님
하나 지적하자면 std::vector 역할을 하는 C struct를 만든다 치면 shallow copy는 trivial한 게 맞지만 deep copy는 그렇지 않음. 다만 deep copy가 trivial하면 일반적으로 move의 성능 향상이 무의미한 건 맞음.
애초에 std::is_trivially_copyable_v 자체가 deep copy가 trivial한지 아닌지를 따지는 건데
constructor, assignment operator가 trivial한지를 따지는 거라 그 trivial operation이 deep copy를 하는지 따지지는 않음
니말대로 deep copy가 필요한데 copy 연산을 shallow copy로 구현했다든가 하는 경우에는 is_trivially_copyable_v가 되긴 하겠지. 뭔소릴 하고 싶은 거지? 애초에 본문에서도 'std::string, std::vector 같은 것만 move하는게 더 빠른거임' 이라고 명시되어 있는데
그 마지막 주장은 맞는데 중간에 오류가 있는 부분이 있어서 언급했을 뿐임
C++11 move semantics의 의의는 lvalue와 rvalue를 구분하여 copy보다 더 저렴하게 move가 가능할 때 불필요한 copy를 없애는 것에 있는데 C에서 이걸 달성하려면 문법이 너무 많이 바뀌어야 하는 게 오히려 더 큰 걸림돌이라고 생각함.