Trong trường hợp này, đối với các mảng nhỏ, sẽ hiệu quả hơn khi phân bổ chúng trên ngăn xếp. Có lẽ thậm chí sử dụng một wrapper tiện lợi như std::array<std::array<int, 10>, 10>
. Tuy nhiên, nói chung, nó là hợp lệ để làm điều gì đó như sau:
auto arr = new int[a][b];
đâu a
là một std::size_t
và b
là một constexpr std::size_t
. Điều này dẫn đến phân bổ hiệu quả hơn vì chỉ có một cuộc gọi đến số operator new[]
với số sizeof(int) * a * b
làm đối số thay vì số a
gọi tới operator new[]
với số sizeof(int) * b
làm đối số. Như Galik đã nêu trong câu trả lời của anh ta, đó cũng là tiềm năng cho thời gian truy cập nhanh hơn, do sự kết hợp bộ nhớ cache tăng lên (toàn bộ mảng là tiếp giáp trong bộ nhớ). Tuy nhiên, lý do duy nhất tôi có thể tưởng tượng một bằng cách sử dụng một cái gì đó như thế này là với ma trận/tensor có kích thước thời gian, nơi tất cả các tham số được biết tại thời gian biên dịch, nhưng nó phân bổ trên heap nếu nó vượt quá kích thước ngăn xếp. Nói chung, có lẽ tốt nhất bạn nên viết lớp trình bao bọc RAII của riêng bạn như sau (bạn cũng cần thêm các trình truy cập khác nhau cho chiều cao/chiều rộng, cùng với việc triển khai một hàm tạo/sao chép và chuyển nhượng, nhưng ý tưởng chung là ở đây:
template <typename T>
class Matrix {
public:
Matrix(std::size_t height, std::size_t width) : m_height(height), m_width(width)
{
m_data = new T[height * width]();
}
~Matrix() { delete m_data; m_data = nullptr; }
public:
T& operator()(std::size_t x, std::size_t y)
{
// Add bounds-checking here depending on your use-case
// by throwing a std::out_of_range if x/y are outside
// of the valid domain.
return m_data[x + y * m_width];
}
const T& operator()(std::size_t x, std::size_t y) const
{
return m_data[x + y * m_width];
}
private:
std::size_t m_height;
std::size_t m_width;
T* m_data;
};
Nguồn
2015-10-03 10:31:35
Nó không muốn sử dụng ' mới'. –
nếu kích thước được biết trước và nó không phải là tốt hơn không sử dụng mới. –
Để công bằng, có những trường hợp bạn vẫn cần sử dụng 'mới' cho loại điều này (ví dụ: gọi API cũ), vì vậy sẽ tốt hơn nếu bạn trả lời câu hỏi như được đặt ra, thay vì phân phát lời khuyên của ông già về C++ hiện đại nhất thực hành. ;-) –