如何用C++这样的语言验证代码在硬件中的实际作用

How to verify what code actually does in the hardware in a language like C++?

本文关键字:硬件 作用 代码 验证 C++ 何用 语言      更新时间:2023-10-16

p.S.我对编程还很陌生。

使用过Javascript后,我一直想学习C++,因为它们的语法看起来很相似,而且我对代码在硬件中的实际作用很感兴趣。

然而,我们实际上不能简单地看待硬件活动,对吧?

我只能接受编译器的说法,即我的数组只正确分配了5个索引,但我不能在我的ram或其他东西中直观地看到这一点,对吧?

我该如何更好地验证这样的东西?

对于JavaScript,它并没有真正困扰我,因为我主要只是写了更多不可计数的东西(或者至少更抽象)来描述我想要发生的事情,所以我怎么能对C++声称它实际上让我可以控制这些微小的事情更有信心呢?

我认为您正在寻找的是一个调试器。许多IDE都提供一个,而VisualStudio附带的IDE允许您查看内存、寄存器和CPU活动。如果您想手动执行,您可以始终依靠内联程序集,或者通过比较在堆栈或堆上分配的对象的地址。

然而,我们实际上不能简单地查看硬件活动,对吧?

调试器值得学习,简单的程序很容易调试。请记住,在大多数台式机上,调试代码都在虚拟内存中运行。。。这意味着这些地址可能不是硬件地址,它们是虚拟的,并且可能映射到任何物理ram。


我只能接受编译器的说法,即我的数组已经正确只分配了5个索引,但我在ram或其他什么很容易对吗?

我不确定你认为"正确"是什么意思。只要它按照你说的那样行事,它怎么可能是不正当的呢?我无意冒犯,但如果有什么不恰当的地方,你或我怎么能认出呢?对齐衬料根据我的经验,编译器"插入"的填充(在任何结构中)在调试器显示中都是可见的。

使用调试器"检查"的任何内存都来自虚拟内存。显示的地址是您的代码正在使用的虚拟ram地址。


对于JavaScript,它并没有真正困扰我,因为我主要只是在写更多不可计数的东西(或者至少更抽象)我想发生什么,那么我该如何感受更多对C++充满信心,声称它实际上让我可以控制这些小东西?

通过实践。

我在嵌入式系统上有多年的C++经验,主要是vxWorks。嵌入式系统通常具有虚拟内存。内存映射i/o通常通过特殊硬件进行访问,操作系统会被"告知"其特殊性质,并且硬件通常与"常规"虚拟ram具有不同的时序。


我该如何更好地验证这样的东西?

诸如此类的东西?我不确定你认为你能在Java中看到什么。

你认为在C++中看不到什么"东西"?


调试器值得学习,简单的程序易于调试。

而且你总是被允许"加入"一些诊断性的cout。在这个例子中,我实现了重载的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行。


如果以上内容有所帮助,您可以下一步尝试在此代码上运行调试器。只需在表演程序中添加一个断点。然后运行,并检查结果,继续到下一个断点,检查结果,重复。