小编Dan*_*iel的帖子

一组向量是完全连续的内存吗?

我知道向量保证是连续的内存,数组也是如此.那么当我做这样的事情时会发生什么:

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]

这是否与我有一个结构数组时的情况相同,其中结构体有一个具有可变大小的成员,例如字符串或另一个向量?

c++ memory arrays

5
推荐指数
1
解决办法
1075
查看次数

存储变量类型信息的方式和位置?

如果我为int分配了内存,我将(通常)给出4个字节.据我所知,这4个字节组成了这个变量在内存中的整个足迹.

此外,如果我有一个指向此int的指针,它将保存其4个字节中第一个的地址.

但是,我的程序如何知道这4个字节中的数据类型由单个int组成?由于我的指针只保存了这个地址,据说只保存原始数据,它如何知道每当它所拥有的地址被解引用时,它应该被解释为一个int?

这种类型的信息在哪里,程序如何以及何时访问它?

c types pointers

2
推荐指数
1
解决办法
428
查看次数

在Arduino上将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的二进制表示的每一位使用一个字节,这是非常愚蠢的.

c serial-port arduino char uart

1
推荐指数
2
解决办法
1万
查看次数

删除指针后,指针保持的地址会发生变化

在下面的代码中,为什么指针保持的地址xdelete?之后改变?据我所知,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,我只是想了解是什么驱使这种奇怪的行为.

c++ pointers delete-operator

1
推荐指数
1
解决办法
573
查看次数

通过矢量引用是否转移了其数据的所有权?

传递和转移向量及其数据的所有权的最佳方法是什么?

在一个理想的世界中,它会像这样工作:

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_ptrboost::shared_ptr处理此向量输出?(不能使用C++ 11的unique_ptr!)

c++ rvo

0
推荐指数
1
解决办法
514
查看次数

标签 统计

c++ ×3

c ×2

pointers ×2

arduino ×1

arrays ×1

char ×1

delete-operator ×1

memory ×1

rvo ×1

serial-port ×1

types ×1

uart ×1