Thích Hoa Có Chậu
Senior Member
Cảm ơn bro nhiều ![Laugh :LOL: :LOL:](https://data.voz.vn/styles/next/xenforo/smilies/popo/laugh.png?v=01)
Sent from Xiaomi Redmi K30 Pro using vozFApp
![Laugh :LOL: :LOL:](https://data.voz.vn/styles/next/xenforo/smilies/popo/laugh.png?v=01)
Sent from Xiaomi Redmi K30 Pro using vozFApp
Sao không thử universal reference?, 1 ctor là đủ.C++:Foo(std::string&& s, int n) : name{std::move(s)} // move ctor , value{n} { }
nhưng xài rvalue ref vẫn vướng 1 cách truyềnđó là truyền const lvalue vào:![]()
thế là phải viết thêm 1 ctorC++:const std::string default{"default"}; foos.emplace_back(default, 0); // rvalue ref ko bind vào const lvalue được, báo lỗi
Foo(const std::string&, int)
à? Cái này đụng chạm quy luật DRY dont repeat yourselfC++ rác vậy xao![]()
![]()
nhưng ko, truyền copy to the rescue![]()
![]()
![]()
C++:Foo(std::string s, int n) : name{std::move(s)} // move ctor , value{n} { }
![]()
#include <cstdio>
#include <utility>
struct A {
A() = default;
A(A const &a) { std::puts("copy"); }
A(A&& a) { std::puts("move"); }
};
struct Foo {
template <typename T>
Foo(T &&t, int n) : a{std::forward<T>(t)}, value{n}
{
}
A a;
int value;
};
int main()
{
A a;
const A a2;
std::fputs("Foo f1{a, 1}: ", stdout);
Foo f1{a, 1};
std::fputs("Foo f2{std::move(a), 1}: ", stdout);
Foo f2{std::move(a), 1};
std::fputs("Foo f3{A{}, 1}: ", stdout);
Foo f3(A{}, 1);
std::fputs("Foo f4{a2, 1}: ", stdout);
Foo f4{a2, 1};
std::fputs("Foo f5{std::move(a2), 1}: ", stdout);
Foo f5{std::move(a2), 1};
std::fputs("Foo f6{A{a2}, 1}: ", stdout);
Foo f6{A{a2}, 1};
}
Foo f1{a, 1}: copy
Foo f2{std::move(a), 1}: move
Foo f3{A{}, 1}: move
Foo f4{a2, 1}: copy
Foo f5{std::move(a2), 1}: copy
Foo f6{A{a2}, 1}: copy
move
đụng tới template compile chậm ko cần thiết khi T chỉ là 1 kiểu. Phải bỏ vào header file mà ko bỏ ctor vào cpp file để save vài mili giây compile là chậm ròiSao không thử universal reference?, 1 ctor là đủ.
https://godbolt.org/z/qonTMzrGv
C++:#include <cstdio> #include <utility> struct A { A() = default; A(A const &a) { std::puts("copy"); } A(A&& a) { std::puts("move"); } }; struct Foo { template <typename T> Foo(T &&t, int n) : a{std::forward<T>(t)}, value{n} { } A a; int value; }; int main() { A a; const A a2; std::fputs("Foo f1{a, 1}: ", stdout); Foo f1{a, 1}; std::fputs("Foo f2{std::move(a), 1}: ", stdout); Foo f2{std::move(a), 1}; std::fputs("Foo f3{A{}, 1}: ", stdout); Foo f3(A{}, 1); std::fputs("Foo f4{a2, 1}: ", stdout); Foo f4{a2, 1}; std::fputs("Foo f5{std::move(a2), 1}: ", stdout); Foo f5{std::move(a2), 1}; std::fputs("Foo f6{A{a2}, 1}: ", stdout); Foo f6{A{a2}, 1}; }
ùi gắt vậy ạMột bài khá phổ biến là cài đặt HTTP server bằng C++, không được dùng lib network ngoài mà chỉ được dùng Linux socket. 100k requests/s, 10k connections.
đụng tới template compile chậm ko cần thiết khi T chỉ là 1 kiểu. Phải bỏ vào header file mà ko bỏ ctor vào cpp file để save vài mili giây compile là chậm ròi![]()
vậy thì mất công ko giấu được implementation của ctorTừ khoá: explicit instantiation.
Sent from Xiaomi M2007J20CG using vozFApp
F{a}
tạo copy ko cần thiết đâu. Vậy đâu có khác gì viết thẳng F(A a, int n)
luôn std::move(const&)
được const T&&
nó hiểu là const T&
vậy thì mất công ko giấu được implementation của ctor![]()
à mà viết vậy đâu có cản user xàiF{a}
tạo copy ko cần thiết đâu
ý giờ mới biếtstd::move(const&)
đượccó trong ví dụ ở cuốn Effective Modern C++ luôn
thặc phản logic![]()
![]()
Sao không dấu được nhỉ?
Cứ làm như bình thường thôi, define trong header, implement + explicit instantiation trong cpp.
Sent from Xiaomi M2007J20CG using vozFApp
F{a}
được thì sao F(A a)
đâu: xài với const lvalue được: tốn 1 copy cần thiết, xài với xvalue prvalue được, nhưng vẫn gặp vấn đề truyền lvalue quên biến nó thành xvalue để bỏ qua 1 copy ko cần thiếtF(A&& a)
thì truyền lvalue ko được, buộc phải move, tối ưu, và truyền const lvalue ko được, nhưng có thể gọi F{A{a}}
, vẫn tốn đúng 1 copy F{std::move(const_lvalue)}
vẫn được nếu kiểu A
có copy ctor. Ủa mà gọi F{A{a}}
là A
phải có copy ctor rồi ko đến nỗi gắt như bác kia bảo đâu, hỏi thêm IPC, ít thuật toán nữa. Có ô thích hỏi aligment....gần 1 năm rồi mới quay lại job c++. Ae cho hỏi đi phỏng vấn job c++ đợt này thường hỏi những gì ạ. em nhớ ngày xưa đi pv toàn hỏi mỗi opp với con trỏ
Chắc thím trollMột bài khá phổ biến là cài đặt HTTP server bằng C++, không được dùng lib network ngoài mà chỉ được dùng Linux socket. 100k requests/s, 10k connections.
Chắc thím troll![]()
Kể cả cho về nhà đi nữa thì bài này tôi thấy không dính dáng gì đến C++ cả vì nó là kiến thức lập trình socket và có thể implement bằng các ngôn ngữ khác, chắc chỉ cho vị trí lập trình hệ thống linux.Bài C10K quá nổi tiếng rồi, nhưng mà thường kiểu cho bài tập về nhà thôi chứ hỏi tại chỗ ai làm làm kịp được.
Lượng code base còn dùng chuẩn cũ vẫn chiếm nhiều lắm (phần lớn đến từ đống Win32, MFC, embedded) mà không phải công ty nào cũng sẵn lòng move sang chuẩn mới.xì mát pon tơ 12 năm rồi mà anh kêu mới hả![]()
thặc đao lòng tính năng ra 12 năm mấy ông dev đéo thèm ngó ngàng![]()
đao lòngLượng code base còn dùng chuẩn cũ vẫn chiếm nhiều lắm (phần lớn đến từ đống Win32, MFC, embedded) mà không phải công ty nào cũng sẵn lòng move sang chuẩn mới.
Cty cũ t làm xài C++03, dùng boost để xài mấy cái mới ở C++11 như smart pointer.Lượng code base còn dùng chuẩn cũ vẫn chiếm nhiều lắm (phần lớn đến từ đống Win32, MFC, embedded) mà không phải công ty nào cũng sẵn lòng move sang chuẩn mới.
Cty cũ t làm xài C++03, dùng boost để xài mấy cái mới ở C++11 như smart pointer.
Cty hiện tại thì đang xài C++17,![]()
T giờ đi pv thì hỏi công ty làm C++ version mấy, nếu xài dưới C++17 là red flag. Vì kinh nghiệm vào mấy công ty này làm thường là maintain đống code cũ, dev cũng không quan tâm đến best practice, expert trong công ty thường là expert về domain, không phải expert về softwarecông ty cũ cũ dùng c++03, đến tận 2020 chuyển sang công ty cũ mới được dùng c++11. Nghĩ nó đau lòng