向#define专家提问 - 页 3

 
Alexandr Andreev:


每个人似乎都明白.....

因此,这是为那些刚刚开始工作的人准备的....。

我们可以将其全部包裹在一个统计类中,并返回一个引用,然后将其余部分均衡化,因为这个方法在与if (a!=5) Print(a)工作时有一个减号;这将不起作用,你应该总是写if (a!=5) {Print(a);},在类中你可以纠正这个时刻,但我太懒了)),一般来说,这似乎都是在历史的档案馆里

按照类的方式,通过静态方法初始化我们的数据,并结合运算符调用我们的print....。那么如果(a!=5)Print(a); , 它将工作

这都是来自于懒惰。我得意忘形,但我放弃了。减少了一些东西,但要合理。 除了打印,写到文件里 的东西要么是收集数据,要么是研究出算法,设置。而如果你将预定的丁字裤打入印刷品中,逗号就会打印出来。总而言之,它当然是在训练大脑,但它甚至没有显示路径。

 
Alexandr Andreev:



Dmitry Fedoseev:


Vladimir Simakov:


正好,我可以问你一个问题吗?对于编译器来说,定义和函数调用 之间有什么区别。我得出的结论是,它不是。我是不是搞错了?

 
Valeriy Yastremskiy:

正好,我可以问你一个问题吗?对于编译器来说,定义和函数调用 之间有什么区别。我得出的结论是,它不是。我是不是搞错了?

Define 是在 BEFORE 编译过程中的一个替换,所以 __LINE__ 变得和它应该有的完全一样,你可以替换一个不完整的代码片段。

而函数在许多语言中是代码引用(goto),在其他语言中是运行时的代码替换(展开所有函数)。

藐视是一种邪恶的行为,因为它使人们更难发现错误,所以好的藐视是没有藐视的时候。
 
Alexandr Andreev:

定义--在编译时进行替换,所以__LINE__会变成完全应该的样子,你可以替换不完整的代码片段

而函数在许多语言中是代码引用(goto),在其他语言中是运行时的代码替换(展开所有函数)。

关于MKL的问题。我没有理解错,在可执行文件中没有goto,除了循环这个问题是由汇编的特殊性引起的。严格地说,是自上而下。如果在循环体的底部声明了一个变量,并在循环条件中调用,将会有一个警告。产量从上到下检查。而可执行文件是通过替代函数作为定义生成的,而不是通过Goto 引用。

 
Alexandr Andreev:

定义--在编译时进行替换,所以__LINE__会变成完全应该的样子,你可以替换不完整的代码片段

许多语言中的函数是对代码的引用(goto),而在其他语言中,代码在运行时被替换(展开所有函数)。

所以替换只影响编译时的构建速度?
只有在建造大型项目 时才合理吗?
或者说停用的代码在可执行文件中会被更快地执行?

 
Valeriy Yastremskiy:

这个问题是与MKL有关的。我没有理解错,在可执行文件中没有goto,除了循环这个问题是由汇编的特殊性引起的。严格地说,是自上而下。如果一个变量被声明在循环体的底部,并且在循环条件中被调用,将会有一个警告。产量从上到下检查。而可执行文件是通过替代函数作为定义生成的,而不是通过Goto 引用。

不,MCL在2008年肯定使用了代码参考法。

现在是否使用完全解卷并不明显。

如今,编写自己的编译器在任何计算机科学系都是3-4年的事。

那里的一切可能相当复杂--有引用和去折叠,所以人们可以随心所欲地写他或她的代码。

最有可能的是,他们披露他们可以披露的东西,但不是所有的东西。很明显,像for等运算符是一个完全不同的情况。

 
Roman:

所以替换只在编译时影响构建速度?
只有在建造大型项目时才合理吗?
或者说停用的代码在可执行文件中仍然会运行得更快?

部署通常的功能本身就是

例如,对于(int i=0; i<ArraiSize(max); i++)

这里ArraiSize(max);将被展开,它将得到类似于给定数组大小的地址(如果我们看一下数组,它的大小在一个变量中,这里我们得到了这个变量 "内存中的地址 "的替代),也就是说,把它本身变成一个变量没有任何意义

for (int i=0; i<ArraiSize(max); i++)

и

for (int i=0; i<size; i++)

在这种情况下,ArraiSize(max)和size在确定数组的大小 值时具有相同的时间性

 
Alexandr Andreev:

不,μl在2008年肯定使用了代码参考法。

现在是否使用完全解卷并不明显。

如今,编写自己的编译器是任何计算机科学系的第三至第四年。

那里的一切可能相当复杂--有引用和去折叠,所以人们可以随心所欲地写他或她的代码。

最有可能的是,他们披露他们可以披露的东西,但不是所有的东西。很明显,像for等运营商是一个完全不同的情况。

谢谢你。从正在进行的错误和缺陷主题来看,优化是一切....。好吧,有点邪恶,导致光)))),如果汽车也要走这条路,就会有永恒的维修)

 
Roman:

所以替换只在编译时影响构建速度?
只有在建造大型项目时才合理吗?
还是在可执行文件中,失效的代码会被更快地执行?

1 - 也许是的,但在微秒内 =)

2 - 很可能恰恰相反,你需要使用最短的定义和最小的定义。

3 - 在2008年,这种说法对μl4来说是正确的。但现在的速度将是一样的

 
Alexandr Andreev:

部署正常功能是理所当然的事

例如,对于(int i=0; i<ArraiSize(max); i++)

这里ArraiSize(max);将被扩展,它将得到类似于给定数组大小的地址(如果我们看一下数组,它的大小在一个变量中,这里我们对这个变量 "内存中的地址 "进行替换),即根本没有必要将它改为一个变量

for (int i=0; i<ArraiSize(max); i++)

и

for (int i=0; i<size; i++)

在这种情况下,ArraiSize(max)和size在确定数组的大小值时具有相同的时间性

在这个样本循环中,我想我不同意关于时间的说法。
相反,建议用大小变量获取结果,并在条件中使用它。
原因是在ArraiSize(max) 每次迭代中 循环会不必要地解开,减慢了循环的执行。
这就是汇编代码中不必要的指令。

原因: