对OOP的帮助 - 页 3

 
Vasiliy Sokolov #:

好的。我不明白。你明白吗?你确定你明白吗?确切地说?

该论点可归结为以下声明。

...

那不是关于一般的争论,而是关于一个单独的帖子的情况,我解释了问题是什么。好吧,没有什么大灾难。

 

宣告的数组双倍x[268435448]

OnStart()函数 中是相同的数组。

还做了一个具有LONG_MAX深度的递归调用。

没有问题。

 
fxsaber #:

不使用静态数组?

如果数组的大小是小的、恒定的、事先知道的,那么静态的就更好,可能更快。

 
Andrei Trukhanovich #:

如果数组的大小是小的、恒定的、事先知道的,那么静态的就更好,可能更快。

我想有一种方法来获得静态变量/数组的列表和它们的大小。可能需要一个像这里 做的代码分析器。

我想静态字符串数组和双数组是完全不同的东西。

MQL5 Program Packer
MQL5 Program Packer
  • www.mql5.com
This is MQL5 project packer: assemble all source and resource files from dependencies into a single ZIP.
 
fxsaber #:

我想静态字符串数组和双数数组是完全不同的东西。

字符串本质上是一个由指针和int大小组成的内部类,也就是说,对于双倍数组来说,所占空间有条件地减少1.5倍。

我认为,除非你有几百万个元素的静态数组,否则费力不讨好是没有什么意义的。

 
fxsaber #:

不使用静态数组?

因此,MQL中基本上有四种类型的数据。

  • 静态的、预定义的数据。在编译时缝合到程序中,不再修改。它们位于一个私人的记忆空间里。例如,这些是char[1024]类型的静态数组。
  • 通过指针手动管理数据。这些是类的实例,但由指针定义,例如CFoo* bar,其中bar是CFoo的一个实例。这些实例的类型是POINTER_DYNAMIC。这种存储类型是最有问题的,尽管在大多数情况下不需要它。
  • 由程序运行所在的mql虚拟机的垃圾收集器管理的数据。这包括类的实例。指向这种类型的对象的指针将是POINTER_AUTOMATIC。这些对象本身要么在这个虚拟机的堆里,要么在私人部分。究竟如何取决于数据和它的大小,显然,以及开发者所拥有的任何东西。这方面的信息是不存在的。此类数据包括用户类别,例如。任何没有指针的类实例的定义都定义了这种存储类型。例如,CFoo bar定义了一个bar类CFoo的实例,它的指针不需要被释放。虚拟机执行释放的所有操作。你不需要使用删除操作符,因此面临着对象泄露的问题。
  • 位于堆栈上的数据。首先,这些是函数的局部变量。例如,当我们在任何函数中写下int a = 5时,堆栈的顶部被向上移动4个字节,从而分配了所需的内存大小。也许,在MQL中,存储在堆栈中的类型也包括结构(说实话,我从未检查过)。这样的数据所占的位置不多,即使考虑到嵌套函数的调用链,堆栈作为一个整体所需的内存也比堆少得多。这种类型的存储是自动使用的,你不必去想它。

如果我们把堆栈留给函数和它们的局部变量,我们就只剩下三种类型可以处理。我个人认为(这只是我的观点),用自动寿命定义的数据很好地结合了前两种类型的优点,没有它们的缺点。用自动指针定义的数据和静态的一样可预测和安全,但又和动态的、人工控制的数据一样灵活。我所说的可预测性是指在不需要做额外的指针位检查和不知道之前是否有其他人已经删除了数据的情况下。我所说的灵活性是指这样的情景:人们可以像处理普通指针一样处理由自动指针引用的数据,通过将指针传递给一个函数,或者对于数组,通过回收它来处理。

为了说明我刚才所说的,你可以比较Ihor Herasko提供的初始代码和我为POINTER_AUTOMATIC编写的相同代码。没有额外的检查和初始化,没有操作员删除60 000 000次。所有这些都为您节省了时间和精力,更重要的是,节省了资源。如果你了解它,你几乎不需要用指针来工作。你总是可以写出这样一种算法,将这一工作降到最低,或者根本不留。例如,我从不在我的代码中手动处理对象--这在某种程度上是没有必要的。至于静态数组,那么有时我不得不使用,例如,把它需要的数据缝进程序,但它是如此特殊的东西,普通用户,我假设,不需要它们。最好是使用现成的集合,如CArrayObj,或你自己的集合。现在模板和MQL功能允许你创建相当灵活的东西,比静态数组好得多。

 
emcool中没有垃圾收集器。
 

Vasiliy Sokolov #:

静态的、预定义的数据。在编译时缝合到程序中,不再修改。它 们被存储在一些私有的内存区域。例如,这些是char[1024]类的静态数组。

如果阵列没有被初始化。

int A[] = {1, 2}; // Инициализация
int B[2];         // Без инициализации

为什么要写进EX5?

 
fxsaber #:

如果阵列没有被初始化。

为什么要把它缝在EX5里?

是的,没错,未初始化的当然是不缝合的。初始化的就可以。但这两种类型的大小是在编译时定义的,不会再改变。也就是说,静态数组可以有条件地分为两组。

 
Dmitry Fedoseev #:
emcool中没有垃圾收集者。

官方说,是的。非官方的,许多事情表明它确实存在。

  • 在MQL中没有指针。相反,它们被一些看起来很像它们的东西所取代。
  • 在MQL中没有直接的内存分配,例如在C中。
  • MQL中的程序是由某个虚拟机执行的。雷纳特简短地写了一下,而且一次也没有。
  • 可以定义将被自动释放的类实例。因此,有一些机制可以监控这些实例,并在必要时释放它们。如果不是垃圾收集者,那是什么?
  • 任何通过指针初始化并且没有正确释放的实例在退出时将被标记为泄漏的对象。它们的数量和丢失的内存的总大小将被打印出来。一个内存泄漏的程序甚至不会在市场中得到验证。因此,所有的对象,甚至是手动分配的对象,都被计算在内,并为系统所知。这是垃圾收集者解决的经典任务之一。