【发布时间】:2023-03-03 01:39:01
【问题描述】:
我正在制作 ASCII 游戏,我需要性能,所以决定使用 printf()。但是有一个问题,我将我的 char 数组设计为多维 char ** 数组,打印它输出的是内存垃圾而不是数据。我知道可以使用 for 循环打印它,但性能会以这种方式迅速下降。我需要像静态数组[][] 一样打印它。有什么办法吗?
我做了一些工作和不工作数组的例子。我只需要 printf() 来处理 nonWorking 数组。
编辑:在 Win 10 上使用 Visual Studio 2015,是的,我测试了性能,cout 比 printf 慢得多(但我真的不知道为什么会这样)
#include <iostream>
#include <cstdio>
int main()
{
const int X_SIZE = 40;
const int Y_SIZE = 20;
char works[Y_SIZE][X_SIZE];
char ** notWorking;
notWorking = new char*[Y_SIZE];
for (int i = 0; i < Y_SIZE; i++) {
notWorking[i] = new char[X_SIZE];
}
for (int i = 0; i < Y_SIZE; i++) {
for (int j = 0; j < X_SIZE; j++) {
works[i][j] = '#';
notWorking[i][j] = '#';
}
works[i][X_SIZE-1] = '\n';
notWorking[i][X_SIZE - 1] = '\n';
}
works[Y_SIZE-1][X_SIZE-1] = '\0';
notWorking[Y_SIZE-1][X_SIZE-1] = '\0';
printf("%s\n\n", works);
printf("%s\n\n", notWorking);
system("PAUSE");
}
注意:我想我可以制作某种缓冲区或静态数组来复制和显示数据,但我想知道如果没有它是否可以做到。
【问题讨论】:
-
printf("%s\n%s\n%s\n%s\n [...]", notWorking[0], notWorking[1], notWorking[2], notWorking [3],[....]);会这样做(当然,假设你 NUL 终止每个分配的字符串),但我怀疑它会更快......这只是意味着你使用的是 printf() 实现内部的 for 循环,而不是你的自己的。此外,它会非常丑陋且难以维护。
-
当您在
printf格式字符串中使用%s时,您传递的内容将被强制转换为 const char * 指针。working起作用的原因是它可以成功地解释为单个字符串,而无需 UB。 Notworking无法工作并且是UB,printf无法处理这样的复杂数据结构。您需要使用循环或其他东西。 -
顺便说一句,您实际测量过性能下降吗?因为根据我的经验,与输出 I/O 所花费的时间相比,for 循环本身所花费的时间可以忽略不计(在任何一种情况下都是相同的,因为在任何一种情况下都输出相同的字符)跨度>
-
要记住的另一件事:
printf不是某种魔法,它在内部也使用循环。 -
如果只有一种静态类型的打印文本的方式可以安全地允许您重载自己的流操作符,唉。不过说真的,您对使用
cout的反感可能是错误的,您确定您是unsynching 流,没有使用endl进行不必要的刷新,并在打开优化的情况下进行编译吗?
标签: c++ arrays pointers char printf