P.S。我是编程新手。
使用Java脚本以来,我一直想学习C ++,因为它们的语法看起来很相似,并且我对硬件中的实际代码很感兴趣。
但是,我们实际上不能轻松地查看硬件活动,对吗?
我只能接受编译器的说法,即我的数组仅被正确分配了5个索引,但是我看不到它在ram上的视觉效果或其他易于理解的效果吗?
如何验证类似的东西至少好一点?
使用JavaScript并没有真正打扰我,因为我主要是在写更多我想发生的事情(或者至少是抽象的),所以我如何对C ++声明更有信心它实际上使我能够控制这些小事情?
答案 0 :(得分:4)
我认为您正在寻找的是调试器。许多IDE提供一种,而Visual Studios随附的一种可以查看内存,寄存器和CPU活动。如果要手动执行此操作,则始终可以依赖于内联汇编,也可以通过比较在堆栈或堆上分配的对象的地址来实现。
答案 1 :(得分:0)
但是,我们实际上不能轻松地查看硬件活动,对吗?
调试器值得学习,简单的程序也易于调试。请记住,在大多数台式机上,您的调试代码都在虚拟内存中运行……这意味着这些地址可能不是硬件地址,而是虚拟的,并且可能会映射到任何物理内存。
我只能相信编译器会说我的数组已经正确放置了 仅分配了5个索引,但在我的ram或 还有其他容易的事吗?
我不确定您认为“正确”是什么意思。只要它按照您的指示行事,怎么会不合适?我的意思是没有冒犯,但是您或我如何识别某些不当行为?对准?填充?以我的经验,在调试器显示中可以看到由编译器“插入”的填充(以任何结构)。
您使用调试器“检查”的所有内存均来自虚拟内存。显示的地址是您的代码正在使用的虚拟RAM地址。
使用JavaScript并没有真正打扰我,因为 我主要是在写更多不可数的东西(或者至少是 更抽象)我想发生的事情,那么我会感觉如何 对C ++充满信心,声称它实际上使我可以控制 这些小东西?
练习。
我在嵌入式系统(主要是vxWorks)上具有C ++的多年经验。嵌入式系统通常确实具有虚拟内存。内存映射的I / O通常是通过特殊的硬件访问的,操作系统被“告知”了它们的特殊性质,并且硬件的定时通常与“常规”的虚拟内存不同。
如何验证类似的东西至少好一点?
东西像什么?我不确定您认为可以在Java中看到什么。
您认为在C ++中看不到什么“东西”?
调试器值得学习,简单的程序易于调试。
并且总是允许您“抛出”某些诊断提示。在此示例中,我实现了重载的show函数。 (仅用于开发或诊断……可能您不希望在启用show()的情况下发布代码)
示例:
DTB::SOps_t sops; // string operations
// digiComma() inserts comma's for readability
void show(uint64_t ui64)
{
cout << "\n " << setw(24) << sops.digiComma(ui64) << flush;
}
void show (uint64_t sum1, uint64_t sum2, uint64_t digit, uint64_t digit2)
{
cout << " "
<< setw(8) << sops.digiComma(sum1)
<< setw(8) << sops.digiComma(sum2)
<< setw(8) << sops.digiComma(digit)
<< setw(8) << sops.digiComma(digit2)
<< flush;
}
show()示例中的用法示例:
int exec()
{
cout << "\n Note that llui and uint64_t "
<< "\n are the same size (on my Linux/g++ system) - 8 bytes"
<< "\n sizeof( llui ): " << sizeof(llui)
<< "\n sizeof(uin64_t): " << sizeof(uint64_t) << endl;
uint64_t checksum = 4024007185756128;
show(checksum);
uint64_t sum1 = 0;
uint64_t digit1 = checksum % 10ULL;
uint64_t sum2 = 0;
while (checksum > 0)
{
sum2 = sum2 + digit1;
uint64_t digit2 = ((checksum - digit1) / 10ULL) % 10ULL;
show(sum1, sum2, digit1, digit2);
checksum = (checksum - digit1 - (digit2 * 10ULL)) / 100ULL;
digit1 = checksum % 10ULL;
digit2 = digit2 * 2ULL;
sum1 = sum1 + digit2;
show(checksum);
if (checksum < 10) { checksum = 0; }
}
if ((sum1 + sum2) % 10ULL == 0ULL) cout << "\n INVALID 1";
else cout << "\n INVALID 2";
return 0;
}
此输出可能被称为执行代码的“跟踪”结果,大约15行。
如果上述内容有所帮助,您接下来可以尝试在此代码上运行调试器。只需在show例程中添加一个断点即可。然后运行,检查结果,继续下一个断点,检查结果,然后重复。