错误、漏洞、问题 - 页 2725

 
Vict:

你认为你的夏普出现在一个干净的领域吗?根植于C语言,该结构是一个哑巴容器,没有多余的糖。

嗯,人类是从猴子进化而来的。但这并不意味着人是一只 "没有任何额外糖分 "的笨猴子,不是吗?)我已经解释过,事实上MQL结构=C#结构,有一个小的区别:在C#中,他们仍然可以实现接口。 接口,卡尔!)

你怎么能如此肯定?从另一个翻译单元/另一个模块/周期/编译器中调用一个函数,不符合要求/....不要高估优化器的能力。这不是编译器必须要做的Copy elision优化。如果优化人员变得如此聪明,不再花费任何代价,他们会在下一个C标准中写道:"默认初始化不会让对象处于未定义状态"。

因为这是最琐碎、最原始的事情,你甚至不能称之为优化。 我想所有的编译器都会默认这样做,即使是在调试模式下。 还有什么能更简单呢? 在代码解析期间,你必须跟踪对变量的访问。如果有一个重复的写操作,并且没有读操作,那么就切掉前一个条目。

你可以忽略它,但随后不要惊讶,当体面的编码员看到你的结构中塞满了函数时,他们会把你看成是一个狗屎编码员

我更愿意称你对未初始化操作的做法为狗屎编码。 一个计算机程序必须具备的主要品质是什么? 稳定性。 在相同的输入数据下,它必须给出不可改变的结果。 而你提议忘记它。 在某个地方你忘记初始化一个变量,在某个地方你在结构中添加了一个新的字段,在整个程序中成为未初始化的,而程序继续进行。该计划以这种方式和那种方式运作...

C语言是在遥远的过去创建的,当时的硬件能力非常差,所以大部分的优化工作都留给了程序员。如果你这么心痒难耐,为什么要提到C语言而不是汇编语言呢? 用汇编语言编码交易系统,我相信他们会是最快的,甚至可能领先于市场 )

 
Alexey Navoykov:

因为这是最琐碎、最原始的事情,甚至很难说是优化。 我想所有的编译器都会默认这样做,即使是在调试模式下。 还有什么比这更简单的呢? 在解析代码的同时,监控变量的访问。如果有一个重复的写操作,并且没有读操作,那么就切掉前一个条目。

如果程序在编译时是完全可预测的,那么在运行时就根本不用执行。根据定义,它应该从外部世界获取一些东西,并在此基础上输出一个结果,而这就是妨碍优化器的不确定性。另一个秘密--共享库在运行时与应用程序链接,优化器不能在那里追踪任何东西。还有一百万个案件要被抛出。(一百万,卡尔!)

在某个地方,我忘记了初始化一个变量,或者在一个结构中添加了一个新的字段,在整个程序中变得没有初始化,而程序还在继续。该计划以这种方式和那种方式运作...

在某处我乘以2而不是3,调用fn()而不是fn_(),......。.如果你的手是错的,你就有麻烦了。

C语言是在很久以前创建的,当时硬件能力很差,这就是为什么很多优化工作都留给了程序员。如果你心痒难耐,为什么要提到C语言而不是汇编语言? 用汇编语言编码交易系统,我相信它们会是最快的,甚至可能领先于市场。

供您参考:C标准(最新的,这些不是C++标准):C11,C18,C2x正在准备中。相反,你写这个是无能的结果。
 
Vict:

如果程序在编译时是完全可预测的,那么它根本不需要在运行时执行。根据定义,它必须从外部世界获取一些东西并在此基础上输出一个结果,而这是阻碍优化器的不确定性。另一个秘密--共享库在运行时与应用程序链接,优化器不能在那里追踪任何东西。还有一百万个案件要被抛出。一百万,卡尔!)

与外部世界的数据交换 是特殊情况,需要特殊的解决方案。 我们谈论的是编程本身,以及那些保证编译器知道变量不受外部控制的情况。 而这一定是绝大多数的情况。 否则你有一个纯粹的系统编程,这确实最好用C语言来做,或者甚至更好--用汇编程序。

在某处乘以2而不是3,调用fn()而不是fn_(),。.如果你的手是歪的,麻烦了。

如果你乘以2而不是3,你就会在程序中得到一个 稳定的 错误,这很容易诊断和发现。 而如果变量没有被初始化,你就会得到一些时而正常时而不正常的东西,后果不可预料。一般来说,我冒充有经验的程序员向你解释这样的基础知识是相当奇怪的。

 
Alexey Navoykov:

与外界的数据交换--这些是特殊情况,需要特殊的解决方案。 但我们谈论的是编程本身,以及那些保证编译器知道变量不受外界控制的情况。 而这应该是绝大多数的情况。 否则,你会得到一个纯粹的系统编程,这确实最好用C语言来做,或者甚至更好--用汇编语言。

与外部世界的沟通是任何项目的一个重要组成部分。让我再重复一遍--否则,它可以在编译时算出来。例如,编译器会不会在这里削减初始化?

int i = 54;
if (read_socket() == SIGNAL) {
   fn(i);
}
i = 100;
...

// естественно, что никто не пишет такой бред:
int q = 3;
q = 7;
q = 9;
fq(q);

很明显,它不知道read_socket()会返回什么。整个项目 "渗透 "在与外部世界的互动中。+ 在这里添加对外部模块的调用....

如果你把它乘以2而不是3,你就会在程序中得到一个 稳定的 错误,这很容易诊断和发现。 而对于一个未初始化的变量,你会得到一些现在能用,然后又不能用的东西,时不时地,会产生不可预知的后果。事实上,我向冒充经验丰富的程序员的你解释这样的基础知识是相当奇怪的。

看,如果你想得到一个稳定的错误,初始化堆栈是非常简单的。

int main() {
    if (true)
        int init_stack[10000] {0};
}

从HIP初始化内存也是小菜一碟。如果我们遇到了一些代表性的陷阱,我们将得到一个核心转储的根本。

再次,如果优化人员非常聪明,他们会将默认init与值init等同起来,由编译器根据需要插入初始化指令,但可惜的是,在一些C11中。没有人强迫,如果你不愿意,让T val{}; 厌倦了解释初级的东西。

 
Vict:

再一次,如果优化人员非常聪明,他们会把默认init等同于值init,编译器会根据需要在一些C11中插入初始化指令,但可惜。没有人强迫,如果你不想要,就把T变成val{}; 厌倦了解释初级的东西。

因为,根据我的理解,C++标准非常正式地描述了规则,没有上下文。 也就是说,初始化要么总是,要么从不。 作为比较,在C#中,你可以声明一个变量而不初始化,但在代码中,它必须被初始化。也就是说,编译器会分析后面的代码,而不仅仅是当前的命令。 这是语言规则中规定的。 但是标准中没有规定C++中的任何分析。因此,如果他们强制初始化,你会抱怨说,我想自己控制和初始化所有的东西!)

 
Alexey Navoykov:

因为根据我的理解,C++标准非常正式地描述了这些规则,没有上下文。 也就是说,初始化要么总是,要么从不。 相比之下,在C#中,你可以声明一个变量而不进行初始化,但在代码中,它必须进一步被初始化。也就是说,编译器会分析后面的代码,而不仅仅是当前的命令。 这是语言规则中规定的。 但是标准中没有规定C++中的任何分析。因此,如果他们强制初始化,你会抱怨说,我想自己控制和初始化所有的东西!)

只是有经过测试的解决方案,如果它能开箱即用,往往会造成不必要的开销,那么就不会有人把它包括在内。 例如,他们在标准中规定,编译器必须在c++17中进行复制消除。

 

这个话题被称为 "错误、错误、问题"。

请创建一个话题,讨论MQL与C#,C++以及其他与语法、编译器和心理锻炼有关的事情。

你在乱扔垃圾,其他问题和用户的信息都淹没在你的讨论中。

他们问我在哪里问问题--我被引导到这里,答案是:"叔叔们在那里争论了一百多页,我就不插嘴了,其他的都没有意义......。

 
const int DEFAULT_INT_VALUE   = 147;
input int thisIsAnInput       = DEFAULT_INT_VALUE;
'NoConstForInput.mq5' NoConstForInput.mq5 1 1
'DEFAULT_INT_VALUE' - 常数预期 NoConstForInput.mq5 13 33
1个错误,0个警告 2 1

第2361和2390号建筑

 
Alain Verleyen:
'NoConstForInput.mq5' NoConstForInput.mq5 1 1
'DEFAULT_INT_VALUE' - 常数预期 NoConstForInput.mq5 13 33
1个错误,0个警告 2 1

第2361和2390号建筑

#define  DEFAULT_INT_VALUE 147
 
Vict:

看,如果你想得到一个稳定的错误,初始化堆栈是非常容易的。

从HIP中初始化内存也是小菜一碟。如果我们遇到一些代表性的陷阱,我们会得到一个完全的核心转储。

最后一句话,请不要对版主生气))。

我需要澄清为什么堆栈在不同的调用中具有不同的值。这都是为了保护https://ru.wikipedia.org/wiki/ASLR, 你甚至根本不需要分析什么,正如我之前所说的。在我的例子中--我在gdb(调试器)下运行软件,每次运行时都会把它放在相同的地址上,也就是说,堆栈不会被 "随机 "返回地址所污染。