Hatalar, hatalar, sorular - sayfa 2499
Ticaret fırsatlarını kaçırıyorsunuz:
- Ücretsiz ticaret uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Anlamak istiyorum.
veri hizalama değil
görünüşe göre bu, sizeof() öğesinin dahili kullanımı dikkate alınarak yapılır, yani. sizeof() fiziksel belleği dikkate almaz, yalnızca her türü bayt cinsinden toplar
hizalama, "içe aktarılan dll işlevlerine geçmek için" yardımında yazıldığı gibi, verilerin fiziksel bellekteki konumudur - farklı derleyicilerde ve dillerde, veri türlerinin boyutu veya daha doğrusu depolanma biçimleri farklı olabilir. bellek, bu nedenle yapının her bir üyesinin "hücresinden çıkmaması" için struct A pack(4) kullanmanız gerekir - bayt
İşte makalede Habré'nin nasıl olduğu:
1 bayt: ch
2 bayt: boş
3 bayt: boş BU karakter ch;
4 bayt: boş
5 bayt: değer[0]
6 bayt: değer[1] BU iç değer;
7 bayt: değer[2]
8 bayt: değer[3]
görünüşe göre bu, sizeof() öğesinin dahili kullanımı dikkate alınarak yapılır, yani. sizeof() fiziksel belleği dikkate almaz, yalnızca her türü bayt cinsinden toplar
Bu doğru değil
Bu doğru değil
daha sonra örneğiniz sizeof() yapısının bayt cinsinden "ağırlığını" doğru bir şekilde hesapladığını kontrol etti,
sadece fiziksel hafızayı kontrol etmek için kalır, ama bence sadece dll çağırırken çalışacak, geliştiricilerin hafızadaki verilerin depolanmasını optimize etmedikleri bir gerçek değil;) - yani. pack(4) kodda amacına uygun olarak kullanılmıyorsa, yürütülebilir kodda yoksayılabilir.
daha sonra örneğiniz sizeof() yapısının bayt cinsinden "ağırlığını" doğru bir şekilde hesapladığını kontrol etti.
Öyleyse şu soru ortaya çıkıyor, hizalama gerçekte nasıl çalışıyor? Dokümantasyon ve Habr, algoritmayı örnekleriyle açıklamadı.
sadece fiziksel hafızayı kontrol etmek için kalır, ama bence sadece dll çağırırken çalışacak, geliştiricilerin hafızadaki verilerin depolanmasını optimize etmedikleri bir gerçek değil;) - yani. pack(4) kodda amacına uygun olarak kullanılmıyorsa, yürütülebilir kodda yoksayılabilir.
Öyleyse şu soru ortaya çıkıyor, hizalama gerçekte nasıl çalışıyor? Dokümantasyon ve Habr, algoritmayı örnekleriyle açıklamadı.
her şey belirli derleyiciye bağlıdır, muhtemelen pack( 4 ) kullanırken verilerin nasıl kaydedildiğini görmek için birlik içinde MQL'yi deneyebilirsiniz.
her şey belirli derleyiciye bağlıdır, muhtemelen pack( 4 ) kullanırken verilerin nasıl kaydedildiğini görmek için birlik içinde MQL'yi deneyebilirsiniz.
Bunu yapmanın offsetof ve başka yolları vardır.
ZY Hizalama görevinin belirsizliği ortadan kaldırmaya hizmet ettiği ortaya çıktı. Ama kendi kullanımım için değil. Eh, açıkça görülüyor ki, bellek tüketimi ve görünüşe göre performans, alanların sırasına bağlı.
ZY Hizalama görevinin belirsizliği ortadan kaldırmaya hizmet ettiği ortaya çıktı. Ama kendi kullanımım için değil.
ve bu " her şey belirli bir derleyiciye bağlıdır " - geliştiriciler genellikle diğerlerine göre geliştirmelerinin performansını artırmak için hileler kullanır, MQL'de kaynak kodu optimizasyonunu devre dışı bırakma gibi derleyici yönergeleri yoktur. - RAM yerel kodunun çalışmasında veya kullanımında farkı göremezsiniz
Not: Bir dosyaya yazma örneğinin kesinlikle her zaman doğru çalıştığından emin değilim, birisi geçenlerde MQL'nin bir dosyaya yazarken Win API tarafından kullanıldığını yazdı, API işlevleriyle uyumluluk için bazı varsayımlar olabilir - ancak bunlar benim tahminlerim, derleyici geliştiricisi değilim
Bunu yapmanın offsetof ve başka yolları vardır.
ZY Hizalama görevinin belirsizliği ortadan kaldırmaya hizmet ettiği ortaya çıktı. Ama kendi kullanımım için değil. Bellek tüketiminin alanların sırasına bağlı olduğunu açıkça görebilirsiniz.
Yanlış yerde bir yeri kazıyorsunuz, hizalama sizin için hiç gerekli değil, işlemcinin buna ihtiyacı var, böylece bazı int iki önbellek satırına girmez. Doldurmanın yapılacağı yer düzenlenmemiştir ve derleyiciye bağlıdır, bu nedenle, dış dünyaya geçerken pack()'e güvenilemez, sadece manuel doldurma.
Yanlış yerde bir yeri kazıyorsunuz, hizalama sizin için hiç gerekli değil, işlemcinin buna ihtiyacı var, böylece bazı int iki önbellek satırına girmez. Doldurmanın yapılacağı yer düzenlenmemiştir ve derleyiciye bağlıdır, bu nedenle, dış dünyaya geçerken pack()'e güvenilemez, sadece manuel doldurma.
Açık, hepinize teşekkürler.
Anlamak istiyorum.
Ve belgeler açıkça söylüyorsa, anlaşılması gereken ne var?
Yapı adı tanımlayıcı olarak kullanılamaz (değişken veya işlev adı). MQL5'te yapı elemanlarının hizalanmadan birbirini takip ettiği unutulmamalıdır. C++ dilinde, komut kullanılarak derleyiciye böyle bir gösterge yapılır.
Ve daha ileride...
Yani MQL5'te hiç hizalama yoktur.