Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何管理多个字符数组变量?_C++_Arrays - Fatal编程技术网

C++ 如何管理多个字符数组变量?

C++ 如何管理多个字符数组变量?,c++,arrays,C++,Arrays,我正在努力学习如何正确发送数据。目前我的做法是为每个命令创建一个新数组 unsigned char data0[]{ 0x00, 0x00 }; CommandSEND(handle, 0x01, 0x31, 0, 0, 2, data0); CommandSEND(handle, 0x01, 0x31, 0, 0, 2, data0); CommandSEND(handle, 0x01, 0x31, 0, 0, 2, data0); unsigned char data1[]{ 0x01 }

我正在努力学习如何正确发送数据。目前我的做法是为每个命令创建一个新数组

unsigned char data0[]{ 0x00, 0x00 };
CommandSEND(handle, 0x01, 0x31, 0, 0, 2, data0);
CommandSEND(handle, 0x01, 0x31, 0, 0, 2, data0);
CommandSEND(handle, 0x01, 0x31, 0, 0, 2, data0);

unsigned char data1[]{ 0x01 };
CommandSEND(handle, 0x01, 0x31, 0, 0, 1, data1);

unsigned char data2[]{ 0x00,0x00 };
CommandSEND(handle, 0x01, 0x45, 0, 0, 2, data2);

// and so on... (i have data# variable going to data20)
我曾考虑使用向量,但我使用的库只接受无符号字符数组。另外,每当你改变向量的大小,它就会删除以前的内存并将其复制到一个新的位置(我相信这就是幕后发生的事情)。我觉得这和我有很多变量没什么不同

我还一直在考虑创建自己的类,该类将接受char数组。如果我给它一个不同的字符数组,它将删除以前的数组并添加一个新数组。在这种情况下,我是否需要在每次将新数组分配给同一个变量之前调用delete?或者我应该在全部使用该变量后调用delete吗?(我猜我每次都需要调用delete,因为我相信每次调用syntax new时它都会找到新指针)

我希望我的代码能够尽可能快地运行,因此我觉得如果我不断地删除和分配代码,这将需要时间,而且可能会有一种更好、更优化的方法来完成

我想学习如何保持代码的优化

谢谢,欢迎您提供任何建议和批评。
我也不确定这个问题的最佳标题是什么。

假设您的代码片段在函数中,您已经在尽可能快地完成工作。您的
unsigned char
数组变量
data0
data1
data2
是自动的,这意味着只需调整函数入口(和出口)上的堆栈指针即可“分配”(和“释放”)——不会发生堆操作

由于数组具有初始值设定项,编译器必须安排将数组的初始内容存储在静态内存中的某个位置,并且在进入函数时,这些初始值设定项会复制到堆栈上自动变量所在的适当区域。这个副本是唯一可以优化的东西(不知何故),但我不知道如何优化,除非
CommandSEND
的最后一个参数是
const unsigned char*
。如果
CommandSEND
修改了该参数,那么每次输入函数时都必须重新初始化数组

实际上,尽管您的注释说,
CommandSEND
修改了它的最后一个参数,但在第一节中您调用了它三次,而没有重新初始化
data0
。因此,要么您打算在这三个
CommandSEND
调用中发送三个(可能)不同的命令,要么
CommandSEND
实际上不会更改其最后一个参数。也许应该改进库(及其头文件),以便为其函数原型提供更好的
const
ness保证。这是一个很重要的例子——如果库可以保证
CommandSEND
的最后一个参数是
const
,那么您可以传递一个
静态const unsigned char[]data0
作为参数。这将消除初始化副本,如果没有其他自动变量,那么函数的进入和退出可能会稍微快一点。如果您发送的所有命令都只有几个字节长,您甚至可以将它们写成
(const unsigned char*)“\x12\x34\x56\x78”
。或者,为了更清晰的表达和更好的可维护性,您可以为命令定义常量或预处理器宏,然后说:

CommandSEND( handle, 0x01, 0x31, 0, 0, 2, FIRST_COMMAND );
CommandSEND( handle, 0x01, 0x31, 0, 0, 2, SECOND_COMMAND );
CommandSEND( handle, 0x01, 0x31, 0, 0, 2, THIRD_COMMAND );

总之,我认为在程序的这一部分中,代码大小或执行速度优化的机会不多。当然,您可以进行一些人工优化,以使其更易于阅读或理解,但要帮助编译器更快地运行,您所能做的就不多了。(在对代码进行分析并确定这确实是您的速度瓶颈所在之前,您不应该尝试这样做--过早优化是所有问题的平方根!)

您正在过早优化…如果让程序的基本逻辑正常工作,您可能会过得更好,然后摆弄不同的内存管理技术,但前提是性能测试表明这就是瓶颈所在。代码片段(
data0
data1
data2
)中的
unsigned char
数组没有被单独分配或删除——实际发生的情况是(在大多数计算机上)当此函数启动时,堆栈指针会递减以为这些数组分配空间。当函数返回时,数组被释放。不慢。你好,谢谢你的回复。我确实完成了我的代码,它工作得很好。我希望对它进行修改,并尽可能地提高它,作为一种学习体验(这是我目前正在进行的修改之一)。我希望能够尽可能地从中挤出更多的性能。我明白了,堆栈在这方面比堆快。我只是觉得为20个命令创建20个变量有点傻。如果
CommandSEND
不需要更改传入的命令,可以将它们作为字符串传递:
CommandSEND(句柄,0x01,0x31,0,0,2,“\0\0”)(您可能必须将字符串强制转换为
常量unsigned char*
)。这将使代码看起来更干净一些,尽管它不会显著改变正在发生的事情。谢谢,这是我没有想到的。但是,我正在使用的库确实更改了我传入的命令,因此我无法使用此方法。我想没有办法改变它。我会保持原样。非常感谢。你可以重写你的评论作为回答,我会接受的。因为它确实回答了我的问题。非常感谢。如果使用向量,这可能会有帮助: