C ++中新分配的int的内存大小,有没有不同更好的方法来查看它?
Memory size of the new allocated int in c++, Is there a different and better way to see it?
在这个程序中,我试图找出为我的指针分配了多少内存。我可以这样看到它应该是 1 吉字节,即 = 1 073 741 824 字节。我的问题是,我可以通过的唯一方法是取 int 的大小为 4 并乘以该常量数。有没有不同的方法?
#include "stdafx.h"
#include <iostream>
#include <new>
int main(){
const int gib = 268435256; //Created a constant int so I could allocate 1
//Gib memory
int *ptr = new int [gib];
std::cout << sizeof (int)*gib << std::endl;
std::cout << *ptr << std::endl;
std::cout << ptr << std::endl;
try {
}catch (std::bad_alloc e) {
std::cerr << e.what() << std::endl;
}
system("PAUSE");
delete[] ptr;
return 0;
}
不,没有办法。编译器在内部添加有关分配了多少内存以及new[]
创建了多少元素的信息,否则它无法正确执行delete[]
。但是,C++没有便携式方法来获取该信息并直接使用它。
因此,您必须在仍然知道大小时单独存储大小。
实际上,你没有,因为std::vector
为你做这件事:
#include <iostream>
#include <vector>
#include <new>
int main() {
const int gib = 268435256;
try {
std::vector<int> v(gib);
std::cout << (v.capacity() * sizeof(int)) << 'n';
} catch (std::bad_alloc const& e) {
std::cerr << e.what() << 'n';
}
}
您实际上永远不应该使用new[]
.使用std::vector
.
请注意,我使用了capacity
而不是size
,因为size
告诉您向量表示多少项,并且该数字可以小于向量当前分配的内存支持的元素数。
也没有办法避免sizeof
,因为int
的大小可以在实现中有所不同。但这也不是问题,因为std::vector
不会丢失其类型信息,因此您始终知道一个元素有多大。
如果是std::vector<char>
、std::vector<unsigned char>
或std::vector<signed char>
,就不需要乘法了,因为这三种字符类型的sizeof
保证为1。
无法从指针中检索分配的内存量。让我们暂时忘记标准容器(和智能指针)的存在,然后您可以使用封装指针和大小的结构。我能想象到的最简单的动态数组是这样的:
template <typename T>
struct my_dynamic_array {
size_t capacity;
T* data;
my_dynamic_array(size_t capacity) : capacity(capacity),data(new T[capacity]) {}
~my_dynamic_array() { delete[] data; }
const T& operator[](int i) const { return data[i];}
T& operator[](int i) { return data[i];}
};
请注意,为了演示,他只是一个基本示例,例如,您不应该复制此结构的实例,否则会发生不好的事情。但是,它可以像这样使用:
my_dynamic_array<int> x(5);
x[3] = 1;
std::cout << x[3];
即使用数组的代码中没有指针和手动内存分配,这是一件好事。实际上,仅此一项就已经是一件大事了,因为现在您可以使用RAII并且不能忘记删除内存。
接下来,您可能想要调整数组的大小,这需要更多的样板文件(再次:请持保留态度!
template <typename T>
struct my_dynamically_sized_array : my_dynamic_array<T> {
size_t size;
my_dynamically_sized_array(size_t size, size_t capacity) :
my_dynamic_array<T>(capacity),size(size) {}
void push(const T& t) {
my_dynamic_array<T>::data[size] = t;
++size;
}
};
它可以像这样使用:
my_dynamically_sized_array<int> y(0,3);
y.push(3);
std::cout << y[0];
当然,当大小大于容量时,需要重新分配内存,并且需要更多的东西才能使这个包装器真正发挥作用(例如,能够复制会很好)。
底线是:不要做任何这些!要编写一个好的成熟的容器类,比我在这里概述的要多得多,其中大部分是样板文件,并没有真正为您的代码库增加价值,因为std::vector
已经是一个围绕动态分配内存的薄包装器,它为您提供了所需的一切,同时不会对您不使用的东西施加开销。
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 有没有更好的方法来处理异常? try-catch块真的很丑
- 有没有更好的方法对C++中的三个整数进行排序?
- 在类的第一个/最后一个实例存在之前/之后调用一对函数.有没有更好的方法?
- 有没有更好的方法可以使用特征/C++实现 matlab 的逻辑索引?
- 有没有更好的方法来为C++写这个?
- 有没有更好的方法来编写这个c++代码
- 有没有更好的方法可以让我接收这些输入?C++
- 有没有更好的方法来使用比特流解码文件格式?
- 我最近正在阅读opencv源代码。有没有更好的方法来在opencv库中查找类定义?
- 有没有更好的方法来添加两个智能指针?
- 重新定义要在函数中使用的静态变量 - 有没有更好的方法?
- 除了使用 clock() 函数之外,有没有更好的方法来以给定的频率生成/发布数据
- 有没有更好的方法来命名管道`cv :: mat`变量
- 模板的模板的模板推演失败(中间有继承),有没有更好的方法.
- C ++中新分配的int的内存大小,有没有不同更好的方法来查看它?
- 有没有更好的方法来检测向量中一个项目的多次出现?
- 有没有比具有多个维度的容器更好的解决方案来进行复杂的数据管理?
- 有没有更好的方法来移动窗口
- 有没有更好的方法来制作事件管理器