如何用C++这样的语言验证代码在硬件中的实际作用
How to verify what code actually does in the hardware in a language like C++?
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行。
如果以上内容有所帮助,您可以下一步尝试在此代码上运行调试器。只需在表演程序中添加一个断点。然后运行,并检查结果,继续到下一个断点,检查结果,重复。
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 未在作用域中声明unordered_map
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 如果编译的源代码是特定于它编译的硬件的,我们如何分发它
- 循环在计数器中不起作用
- 有没有一种方法可以在编译时获得作用域类名
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- C++quit()函数中可能存在作用域问题
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- "using namespace std;"在C++的作用是什么?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 如何用C++这样的语言验证代码在硬件中的实际作用
- 初级C++硬件.函数似乎不起作用