如何管理许多char数组变量?

时间:2018-11-20 23:56:11

标签: 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 };
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数组。同样,无论何时更改矢量的大小,它都会删除先前的内存并将其复制到新位置(这是我相信幕后发生的事情)。我觉得与我拥有许多变量没什么不同。

我也一直在考虑制作自己的可以接受char数组的类。如果我给它一个不同的char数组,它将删除先前的数组并添加一个新的数组。在这种情况下,我是否需要在每次将新数组分配给相同变量之前调用delete?还是一起使用完该变量后,我应该调用delete吗? (我的猜测是,我每次都需要调用delete,因为我相信每次我将语法称为new时都会找到新的指针)

我希望我的代码尽可能快地运行,因此,我觉得如果我继续删除和分配它会花费一些时间,并且可能会有更好,更优化的方法。

我想学习能够使我的代码保持最佳状态。

谢谢,欢迎提出任何建议和批评。 同样不确定这个问题的最佳标题是什么。

1 个答案:

答案 0 :(得分:1)

假设您的代码片段在函数内部,则您已经在尽可能快地执行操作。您的unsigned char数组变量data0data1data2是自动的,这意味着只需调整入口处的堆栈指针即可“分配”(和“释放”)它们进入(或退出)该功能-不会发生堆操作。

由于数组具有初始化程序,因此编译器必须安排好将数组的初始内容存储在静态存储器中的某个位置,并在输入函数时将这些初始化程序复制到堆栈中自动变量的适当区域中生活。该副本是您可能会(可能以某种方式)优化的唯一内容,但是除非看到CommandSEND的最后一个参数是const unsigned char *,否则我看不到您将如何进行优化。如果CommandSEND修改了该参数,则每次输入函数时都必须重新初始化数组。

实际上,尽管您的评论说CommandSEND修改了它的最后一个参数,但是您在第一个节中将其调用了三次,而无需重新初始化data0。因此,您打算在这三个CommandSEND调用中发送三个(可能)不同的命令,或者CommandSEND并没有真正改变其最后一个参数。也许应该改进库(及其头文件)以在其函数原型上提供更好的const性质保证。这是一个可能很重要的示例-如果库可以保证CommandSEND的最后一个参数是const,则可以传递static 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 );

总的来说,我认为程序的这一部分没有太多机会进行代码大小或执行速度优化。您当然可以做一些人为导向的优化,以使其更易于阅读或理解,但是您可以做很多其他事情来帮助编译器使其运行得更快。 (而且,在对代码进行概要分析并确定这确实是速度瓶颈所在之前,您不应该尝试这样做—过早的优化是万恶之源!)