如何将变量或对象存储在所需的内存位置?
How to store a variable or object on desired memory location?
假设我有一个 class 的对象,如下所示:
Myclass obj;
现在我想把这个对象存储到我想要的内存位置。我怎样才能做到这一点?可不可以?
我创建了一个数组 class,它只是在各自的索引中插入整数类型的数据,但数组的大小没有在 class 中声明。我插入少量数据,如 50 到 60 个整数,然后我使用循环在这个 class 中插入大量数据,但是这次我的程序崩溃了,我认为这是因为如果遇到某些索引的原因具有一定价值的内存,程序会自行停止。现在我想分析我的数组对象 class 从那个特定地址开始的内存,该地址包含最大数量的可用空可用内存 spaces
我认为由于一些分配的内存位置不允许更多的插入。现在我想将我的对象放在包含最大可用空可用 space 的内存地址上。请指导我
#include<iostream>
using namespace std;
class newarray
{
public:
int n;
int arr[]; //size not declared
int* ptr;
newarray():n(0),ptr(NULL)
{
}
void getadress(int indexno) //for getting address of an index
{
ptr=&arr[indexno];
cout<<endl<<ptr;
}
void insert(int a) //inserting an element
{
arr[n]=a;
n++;
}
void display()
{
for(int i=0;i<=n;i++)
{
cout<<endl<<arr[i];
}
}
};
int main()
{
newarray a1;
int x=1;
for(int i=0;i<100;i++) //work good with 100 inssertions
//but if exceed to 300 or more it crashes.
{
a1.insert(x);
x++;
}
a1.display();
}
您可以使用 new
运算符将对象初始化到特定的内存位置,内存地址如下所示:
MyObject *obj = new(address) MyObject(arguments);
请注意,当像这样使用“new”时,您可能需要手动调用析构函数以运行其逻辑。
如果是变量,您永远无法选择内存位置。语言实现会为您解决这个问题,在理想情况下甚至可能根本不使用任何内存。
如果是动态对象,可以在您选择的内存位置创建一个对象 - 但有一些限制:在内存映射系统(即任何现代操作系统)上,您只能使用内存你分配的。您通常无法选择分配所在的内存地址,但您可以在分配范围内选择创建动态对象的位置 - 只要地址满足类型的对齐要求即可。 C++ 标准和操作系统都提供了多种分配内存的方法。
嵌入式系统可能是未映射内存的系统。在那里,您没有可以或需要从中分配内存的操作系统。
在这样的系统上,如果您控制了硬件,您将知道您可以通过了解您如何设置硬件来安全地在哪些内存地址中创建对象。如果您不知道硬件是如何设置的,那么您必须阅读文档。
对象有一个唯一的内存地址。一旦对象存在,你就不能改变它在内存中的存储位置。您可以创建一个副本并将该副本存储在其他地方,但您不能在创建该特定对象后将其存储在其他内存地址中。
您不能在内存映射系统中选择任意地址并将对象存储在那里。您需要首先分配一个缓冲区(例如使用 new[]
),然后使用 placement new
.[=16= 在该预分配的缓冲区中构造您的对象]
这是一个简单的例子:
#include <iostream>
#include <cstddef>
class Myclass
{
public:
int m_value;
};
int main( )
{
std::byte* buffer = new std::byte [ sizeof( Myclass ) ]; // allocate a buffer
Myclass* ptr = new ( buffer ) Myclass( 123 ); // construct the object in
// that buffer
std::cout << ptr->m_value << '\n'; // print the value for
// demonstartion purposes
ptr->~Myclass( ); // explicitly call the destructor
delete [ ] buffer; // release the buffer
}
现在回到您的代码中的错误。问题是您的 arr
没有固定大小。这不好。而不是使用 std::vector
以便它可以在 运行 时间通过在其后面插入元素来扩展自身。
这是你程序的固定版本:
#include <iostream>
#include <vector>
class NewArray
{
public:
NewArray( )
: arr( 0 )
{
}
void getAddress( const std::size_t idx ) // for getting address of an index
{
std::cout << '\n' << &arr[ idx ];
}
void insert( const int elem ) // inserting an element
{
arr.push_back( elem );
}
void display( )
{
for( const auto& elem : arr )
{
std::cout << '\n' << elem;
}
}
private:
std::vector<int> arr;
};
int main( )
{
NewArray a1;
int num { 1 };
for ( std::size_t i { }; i < 100; ++i )
{
a1.insert( num );
++num;
}
a1.display( );
}
你写了
class newarray
{
int arr[]; //size not declared
这是不允许的。不幸的是,你的编译器在编译时没有警告你。当您的代码崩溃时,您才发现这是一个问题。
然后您想知道“一些已分配的内存位置”并手动选择一个。那不是问题。 int arr[]
不明确指定边界仅在少数情况下允许,例如函数声明。函数声明不需要大小,因为这种情况下的大小由调用者决定。
由于这是 C++,只需使用 std::vector<int>
作为您的动态数组。
假设我有一个 class 的对象,如下所示:
Myclass obj;
现在我想把这个对象存储到我想要的内存位置。我怎样才能做到这一点?可不可以?
我创建了一个数组 class,它只是在各自的索引中插入整数类型的数据,但数组的大小没有在 class 中声明。我插入少量数据,如 50 到 60 个整数,然后我使用循环在这个 class 中插入大量数据,但是这次我的程序崩溃了,我认为这是因为如果遇到某些索引的原因具有一定价值的内存,程序会自行停止。现在我想分析我的数组对象 class 从那个特定地址开始的内存,该地址包含最大数量的可用空可用内存 spaces
我认为由于一些分配的内存位置不允许更多的插入。现在我想将我的对象放在包含最大可用空可用 space 的内存地址上。请指导我
#include<iostream>
using namespace std;
class newarray
{
public:
int n;
int arr[]; //size not declared
int* ptr;
newarray():n(0),ptr(NULL)
{
}
void getadress(int indexno) //for getting address of an index
{
ptr=&arr[indexno];
cout<<endl<<ptr;
}
void insert(int a) //inserting an element
{
arr[n]=a;
n++;
}
void display()
{
for(int i=0;i<=n;i++)
{
cout<<endl<<arr[i];
}
}
};
int main()
{
newarray a1;
int x=1;
for(int i=0;i<100;i++) //work good with 100 inssertions
//but if exceed to 300 or more it crashes.
{
a1.insert(x);
x++;
}
a1.display();
}
您可以使用 new
运算符将对象初始化到特定的内存位置,内存地址如下所示:
MyObject *obj = new(address) MyObject(arguments);
请注意,当像这样使用“new”时,您可能需要手动调用析构函数以运行其逻辑。
如果是变量,您永远无法选择内存位置。语言实现会为您解决这个问题,在理想情况下甚至可能根本不使用任何内存。
如果是动态对象,可以在您选择的内存位置创建一个对象 - 但有一些限制:在内存映射系统(即任何现代操作系统)上,您只能使用内存你分配的。您通常无法选择分配所在的内存地址,但您可以在分配范围内选择创建动态对象的位置 - 只要地址满足类型的对齐要求即可。 C++ 标准和操作系统都提供了多种分配内存的方法。
嵌入式系统可能是未映射内存的系统。在那里,您没有可以或需要从中分配内存的操作系统。
在这样的系统上,如果您控制了硬件,您将知道您可以通过了解您如何设置硬件来安全地在哪些内存地址中创建对象。如果您不知道硬件是如何设置的,那么您必须阅读文档。
对象有一个唯一的内存地址。一旦对象存在,你就不能改变它在内存中的存储位置。您可以创建一个副本并将该副本存储在其他地方,但您不能在创建该特定对象后将其存储在其他内存地址中。
您不能在内存映射系统中选择任意地址并将对象存储在那里。您需要首先分配一个缓冲区(例如使用 new[]
),然后使用 placement new
.[=16= 在该预分配的缓冲区中构造您的对象]
这是一个简单的例子:
#include <iostream>
#include <cstddef>
class Myclass
{
public:
int m_value;
};
int main( )
{
std::byte* buffer = new std::byte [ sizeof( Myclass ) ]; // allocate a buffer
Myclass* ptr = new ( buffer ) Myclass( 123 ); // construct the object in
// that buffer
std::cout << ptr->m_value << '\n'; // print the value for
// demonstartion purposes
ptr->~Myclass( ); // explicitly call the destructor
delete [ ] buffer; // release the buffer
}
现在回到您的代码中的错误。问题是您的 arr
没有固定大小。这不好。而不是使用 std::vector
以便它可以在 运行 时间通过在其后面插入元素来扩展自身。
这是你程序的固定版本:
#include <iostream>
#include <vector>
class NewArray
{
public:
NewArray( )
: arr( 0 )
{
}
void getAddress( const std::size_t idx ) // for getting address of an index
{
std::cout << '\n' << &arr[ idx ];
}
void insert( const int elem ) // inserting an element
{
arr.push_back( elem );
}
void display( )
{
for( const auto& elem : arr )
{
std::cout << '\n' << elem;
}
}
private:
std::vector<int> arr;
};
int main( )
{
NewArray a1;
int num { 1 };
for ( std::size_t i { }; i < 100; ++i )
{
a1.insert( num );
++num;
}
a1.display( );
}
你写了
class newarray
{
int arr[]; //size not declared
这是不允许的。不幸的是,你的编译器在编译时没有警告你。当您的代码崩溃时,您才发现这是一个问题。
然后您想知道“一些已分配的内存位置”并手动选择一个。那不是问题。 int arr[]
不明确指定边界仅在少数情况下允许,例如函数声明。函数声明不需要大小,因为这种情况下的大小由调用者决定。
由于这是 C++,只需使用 std::vector<int>
作为您的动态数组。