我正在尝试对函数指针调用和虚函数调用之间的差异进行基准测试.为此,我编写了两段代码,对数组进行相同的数学计算.一个变体使用指向函数的指针数组并在循环中调用它们.另一个变体使用指向基类的指针数组并调用其虚函数,该函数在派生类中重载,与第一个变体中的函数完全相同.然后我打印经过的时间并使用简单的shell脚本多次运行基准测试并计算平均运行时间.
这是代码:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
using namespace std;
long long timespecDiff(struct timespec *timeA_p, struct timespec *timeB_p)
{
return ((timeA_p->tv_sec * 1000000000) + timeA_p->tv_nsec) -
((timeB_p->tv_sec * 1000000000) + timeB_p->tv_nsec);
}
void function_not( double *d ) {
*d = sin(*d);
}
void function_and( double *d ) {
*d = cos(*d);
}
void function_or( double *d ) {
*d = tan(*d);
}
void function_xor( double *d ) {
*d = sqrt(*d);
}
void ( * const function_table[4] …Run Code Online (Sandbox Code Playgroud) 我正在使用普通的C和WinAPI编写Win32应用程序.不允许使用MFC或C++.为了使用适当的样式绘制控件,我使用清单,如相应的MSDN文章中所述.一切都很好,当我改变系统风格时,我的应用程序也会改变风格.但使用的字体很难看.如何强制应用程序使用标准系统字体?
我觉得我问的是一个非常基本的问题,但我无法在这里或谷歌找到答案.我记得我们在学校教过这个,但是它已经消失多年了.
为什么cout.precision()(std::ios_base::precision())在输出列表中间调用时会影响整个流?我知道std::setprecision()应该用来改变运行精度的规则,这cout.precision()将破坏输出的返回值.但是这个的机制是什么?是因为缓冲吗?手册陈述这些"做同样的事情",但凭经验我可以看出它并非完全正确.
MCVE:
const double test = 1.2345;
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(2);
cout << test << endl << cout.precision(3) << test << endl;
// Output:
// 1.234
// 21.234
// after the same init
cout.precision(2);
cout << test << endl << setprecision(3) << test << endl;
// Output
// 1.23
// 1.234
Run Code Online (Sandbox Code Playgroud)
这是"具体/未由标准定义的实施"吗?请随意将其标记为重复,因为我无法在SO上找到它.
一旦应用程序与它所需的动态库链接,是否有可能找出哪个确切的库已经拉入了我在列表中看到的另一个库?
例如,今天我遇到了一个情况,一个本来不应该存在的库出现在ldd输出中,并且导致应用程序崩溃。通过逻辑推论,我可以弄清楚并隔离问题,然后重建相应的项目以不再包含错误的库。但是是否有可能在没有关于应用程序及其依赖的库的任何额外知识的情况下,使用来自诸如此类的外部工具来做同样的事情ldd?(问题是所讨论的库没有被应用程序直接使用,而是被应用程序直接链接到的另一个库使用。)
从本质上讲,一旦应用程序链接在一起,我似乎正在寻找一种方法来恢复链接依赖图。
假设存在一个没有涉及多重继承的简单层次结构:
class base {
public:
base() { /* */ }
virtual void init() { /* */ }
};
class derived_a : public base {
public:
derived_a() { /* */ }
virtual void init() override { base::init(); /* local stuff to add */ }
};
class derived_b : public base {
public:
derived_b() { /* */ }
virtual void init() override { base::init(); /* local stuff to add */ }
};
Run Code Online (Sandbox Code Playgroud)
然后客户端代码就像
auto d_a = new derived_a{};
d_a->init();
Run Code Online (Sandbox Code Playgroud)
我看到两个问题:
a)base::init() …
我开始学习Git,不时阅读ProGit书.我听说Git最强大的功能是分支,所以我试着用它们.我正在攻击KDE项目,因此有一个远程服务器和一个本地副本.
所以这是我的情况.我编写了一个错误修正程序,但负责该代码区域的开发人员已经脱机而没有给我一个发货,所以我决定在此期间做一个不同的修复.我听说分支可以(更重要的是,应该)用于这种情况.好的,我创建了一个本地分支
git branch bugfix
Run Code Online (Sandbox Code Playgroud)
然后切换到那个分支
git checkout bugfix
Run Code Online (Sandbox Code Playgroud)
然后广告发现我修改了原始修补程序的文件仍然被修改.(当然,我需要一个干净的目录,只能在没有第一个错误的情况下推送第二个错误修复.)好吧,没问题,我想,如果那就是git status告诉我要做的那就重置一下.我做了重置,确实得到了一个干净的目录.但是嘿,我换回主人之后
git checkout master
Run Code Online (Sandbox Code Playgroud)
修改后的文件不再修改了!这是一个干净的目录.
现在分支有什么意义?不能有两个版本的文件,在一个分支中修改而在另一个分支中不修改?我知道git stash,但如果我这样做,解开更改将杀死第二个错误修复,因为IIRC存储只是将一个文件替换为另一个文件,没有合并完成.
我在这做错了什么?为什么不能在一个分支中修改文件而在另一个分支中不修改?
我想知道是否可以使用strcpy()C中的函数将堆数组复制到堆栈数组中?那有什么潜在的问题吗?
最近我正在调试一个项目,调试器(GDB 7.1)突然崩溃,因为在尝试打印图形结构时无休止的递归.起初我甚至无法想象调试器可能会崩溃(稳定版本),但它有.所以这对我来说真的很有意思,你曾经撞毁过一个调试器吗?
我正在研究一个与连续方法的电路测试相关的小型科学课程.该程序将解析电路定义文件,然后构建一个表示电路的易于修改的图形结构.然后对该图进行某些修改,并对其进行拓扑排序.排序后,图形将转换为由数组列表组成的静态结构,其中每个数组对应于某个拓扑排序程度.之后,可以轻松模拟电路,因为您可以依赖排序顺序并按顺序处理模型.
现在这一切都很好且合乎逻辑,但我提到的两个图是自定义数据结构,它们:
1)不是完全符合STL规范(无论如何对我来说都很长很困难 - 图形比矢量和列表更复杂)
2)对于第二个图,我假设它不可修改并使用矢量矢量或矢量列表来提高速度.
3)我的图表可用的操作集是有限的,反映了我的项目的需求.
4)代码很简单.
现在我只是一名三年级的IT学生,在完成了软件设计课程并阅读了一些现实代码后,我想知道:
1)代码可以(甚至可以)简单吗?
2)在对数据结构做出假设时,我是否违反了数以千计的软件设计原则?
3)我是否真的总是符合我在此项目和未来项目中创建的所有数据结构的STL规范?
该项目使用C++.
感谢您的关注!我很欣赏这些问题的基本和理论答案,以及解决这个问题的实际方法的一个例子.