Giả sử tôi có một lớp học nhưKhông gọi hàm tạo của một lớp trống thực sự sử dụng bất kỳ bộ nhớ nào?
class Empty{
Empty(int a){ cout << a; }
}
Và sau đó tôi gọi nó bằng cách sử
int main(){
Empty(2);
return 0;
}
này có gây ra bất kỳ bộ nhớ được cấp phát trên stack cho việc tạo ra một đối tượng "Empty"? Rõ ràng, các đối số cần được đẩy lên ngăn xếp, nhưng tôi không muốn chịu thêm bất kỳ chi phí nào. Về cơ bản tôi đang sử dụng constructor như là một thành viên tĩnh.
Lý do tôi muốn làm điều này là do các mẫu. Mã thực tế trông giống như
template <int which>
class FuncName{
template <class T>
FuncName(const T &value){
if(which == 1){
// specific behavior
}else if(which == 2){
// other specific behavior
}
}
};
cho phép tôi để viết một cái gì đó giống như
int main(){
int a = 1;
FuncName<1>(a);
}
vì vậy mà tôi có được chuyên môn hóa một số mẫu, trong khi không phải chỉ định loại T
. Ngoài ra, tôi hy vọng trình biên dịch sẽ tối ưu hóa các nhánh khác đi bên trong constructor. Nếu bất cứ ai biết nếu điều này là đúng hay làm thế nào để kiểm tra, điều đó sẽ được đánh giá cao. Tôi cũng giả định rằng việc ném các mẫu vào tình huống không làm thay đổi vấn đề "lớp trống" ở trên, đúng không?
Câu hỏi đặt ra là tại sao bạn quan tâm.Đó là công việc của trình biên dịch để chăm sóc và tạo ra mã tốt nhất. Bạn nên tập trung vào việc viết mã biểu cảm nhất. –
PS. Không có yêu cầu cho đối số được đẩy lên ngăn xếp. C++ ABI được xác định không chính xác để các trình biên dịch có opertunity sử dụng đăng ký để chuyển các tham số nếu điều đó làm cho mã hiệu quả hơn –
Tôi quan tâm vì tôi muốn có hiệu suất cao nhất mà tôi có thể nhận được; Tôi thực sự ghét thái độ mã nên thanh lịch và không phải lo lắng về những điều này. Đôi khi, những điều này quan trọng (tôi làm tính toán hiệu suất cao). –