我知道向量保证是连续的内存,数组也是如此.那么当我做这样的事情时会发生什么:
std::vector<uint8_t> my_array[10];
my_array[2].push_back(11);
my_array[2].push_back(7);
Run Code Online (Sandbox Code Playgroud)
记忆会是什么样的?如果两者都需要是连续的,将在阵列中的每个元素后,my_array[2]在每次我做一个时间推着向前一个字节push_back()上my_array[2]?
这是否与我有一个结构数组时的情况相同,其中结构体有一个具有可变大小的成员,例如字符串或另一个向量?
如果我为int分配了内存,我将(通常)给出4个字节.据我所知,这4个字节组成了这个变量在内存中的整个足迹.
此外,如果我有一个指向此int的指针,它将保存其4个字节中第一个的地址.
但是,我的程序如何知道这4个字节中的数据类型由单个int组成?由于我的指针只保存了这个地址,据说只保存原始数据,它如何知道每当它所拥有的地址被解引用时,它应该被解释为一个int?
这种类型的信息在哪里,程序如何以及何时访问它?
我正在高频采样,需要通过UART从我的Arduino传输10位ADC值.
默认情况下,它每个字符使用一个字节.因此,如果执行analogRead将产生值"612",它将通过UART"6"作为一个字节发送,"1"作为一个字节发送,"2"作为一个字节发送,并将行终止符作为最后一个字节发送.
鉴于我的采样率被这种通信截断,重要的是它尽可能高效和统一,所以我试图强制它使用两个字节来传输那些数据,无论数据实际是什么(通过默认情况下,它将使用三个字节来发送"23",四个字节用于发送"883",五个字节用于发送"1001").
目前,我正在做这样的事情,这是我发现的最好方法:
int a = 600; //Just an example
char high = (char)highByte(a);
char low = (char)lowByte(a);
Serial.print(high);
Serial.println(low);
Run Code Online (Sandbox Code Playgroud)
目前,无论值如何,它都使用三个字节(包括\n).有更有效的方法吗?
只需用类似的东西打印即可
Serial.print(foo, BIN);
Run Code Online (Sandbox Code Playgroud)
根本不起作用.它实际上每foo的二进制表示的每一位使用一个字节,这是非常愚蠢的.
在下面的代码中,为什么指针保持的地址x在delete?之后改变?据我所知,delete调用应该从堆释放已分配的内存,但它不应该更改指针地址.
using namespace std;
#include <iostream>
#include <cstdlib>
int main()
{
int* x = new int;
*x = 2;
cout << x << endl << *x << endl ;
delete x;
cout << x << endl;
system("Pause");
return 0;
}
OUTPUT:
01103ED8
2
00008123
Run Code Online (Sandbox Code Playgroud)
观察:我使用的是Visual Studio 2013和Windows 8.据说这在其他编译器中不起作用.此外,我理解这是不好的做法,我应该在删除指针后重新指定NULL,我只是想了解是什么驱使这种奇怪的行为.
传递和转移向量及其数据的所有权的最佳方法是什么?
在一个理想的世界中,它会像这样工作:
std::vector<int>& SpitAVector(int input)
{
std::vector<int> result;
result.push_back(input);
return result;
}
int main()
{
std::vector<int> myvec;
myvec = SpitAVector(60);
std::cout << (int)myvec[0] << std::endl; //Outputs 60
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为我正在返回对局部变量的引用.
是否可以使用boost::unique_ptr或boost::shared_ptr处理此向量输出?(不能使用C++ 11的unique_ptr!)