[C++] Yüksek miktarda Stack bellek kullanan bazı fonksiyonları optimize edin

Kaptan Yosun

Moderatör
Moderatör
Geliştirici
Yardımsever Üye
Mesaj
1.258
Çözümler
45
Beğeni
1.798
Puan
1.339
Ticaret Puanı
0
:mmt-hakkinda:

!!! Uyarı !!! Benim yazdığım hiçbir şeye güvenmeyin veya gözünüz kapalı kaynak kodunuzu değiştirmeyin. Ben yazılımcı değilim.

AreaTerrain.cpp dosyasında gezerken fark ettim. Visual studio bazı fonksiyonlar için "Çok fazla Stack bellek kullanıyor, bunu Heap belleğe almayı düşünün" diyordu.

1748684113919.webp

Yapay zekaya çok fazla Stack bellek kullanmanın neden kötü kod pratiği olduğunu sordum, dedi ki:

Yapay zeka çıktısı:
Genişlet Daralt Kopyala
TR:
⚠️ 82.040 Bayt Yığın Kullanmanın Kötü Bir Uygulama Olmasının Nedeni
🧠 1. Sınırlı Yığın Boyutu (Genellikle Windows'ta 1 MB)

Bir Windows programındaki her iş parçacığının varsayılan yığın boyutu 1 MB'tır (açıkça artırmadığınız sürece). Yani:

    ~82 KB kullanmak = tüm yığının ~%8'i.
    Bu tehlikelidir, özellikle de birden fazla iş parçacığının kendi yığınını aldığı yinelemeli işlevlerde veya çok iş parçacıklı programlarda.
    Daha kötüsü, bu büyük bir parça kullanan tek işlev olmayabilir; birden fazla büyük yığın işlevi hızla yığın taşması çökmelerine yol açabilir.

🔥 2. Yığın Taşması = Sessiz veya Hata Ayıklaması Zor Çökmeler

Başarısız olduklarında nullptr döndüren yığın tahsislerinin (new/malloc) aksine, yığın taşmaları genellikle anında çökmeye neden olur (genellikle bir hata ayıklayıcı eklenmediği sürece yararlı bir mesaj olmadan).

Belirtiler:

    İşlev çağrıları sırasında rastgele çökmeler.
    Yalnızca büyük resimler veya varlıklarla gerçekleşir.
    Debug'da çalışır ancak Release'de çöker (farklı yığın boyutları veya optimizasyonlar nedeniyle).

💾 3. Yığın Küçük, Kısa Ömürlü Veriler İçindir

Yığın şunlar için tasarlanmıştır:

    İşlev parametreleri
    Dönüş adresleri
    Küçük yerel değişkenler

Büyük tamponlar (256×256 resimler gibi) gigabaytlarca veri tutabilen ve dinamik olarak yönetilen yığın için daha uygundur.

EN:
⚠️ Why Using 82,040 Bytes of Stack Is Bad Practice
🧠 1. Limited Stack Size (Typically 1 MB on Windows)

Each thread in a Windows program has a default stack size of 1 MB (unless you explicitly increase it). So:

    Using ~82 KB = ~8% of the entire stack.
    This is dangerous, especially in recursive functions or multi-threaded programs, where multiple threads each get their own stack.
    Worse, this may not be the only function that uses a large chunk — multiple large-stack functions can quickly lead to stack overflow crashes.

🔥 2. Stack Overflow = Silent or Hard-to-Debug Crashes

Unlike heap allocations (new/malloc), which will return nullptr if they fail, stack overflows usually cause an instant crash (often with no helpful message unless a debugger is attached).

Symptoms:

    Random crashes during function calls.
    Only happens with large images or assets.
    Works in Debug but crashes in Release (due to different stack sizes or optimizations).

💾 3. The Stack Is for Small, Short-Lived Data

The stack is designed for:

    Function parameters
    Return addresses
    Small local variables

Large buffers (like 256×256 images) are better suited for the heap, which can hold gigabytes of data and is dynamically managed.

Nasıl yapılır:
Burayı görüntülemek için üye girişi yapmalı veya kayıt olmalısınız.


Böylece Stack'teki en az 180,396byte(176kb) veriyi Heap'e taşıdık.
 
:mmt-hakkinda:

!!! Uyarı !!! Benim yazdığım hiçbir şeye güvenmeyin veya gözünüz kapalı kaynak kodunuzu değiştirmeyin. Ben yazılımcı değilim.

AreaTerrain.cpp dosyasında gezerken fark ettim. Visual studio bazı fonksiyonlar için "Çok fazla Stack bellek kullanıyor, bunu Heap belleğe almayı düşünün" diyordu.


Yapay zekaya çok fazla Stack bellek kullanmanın neden kötü kod pratiği olduğunu sordum, dedi ki:

Yapay zeka çıktısı:
Genişlet Daralt Kopyala
TR:
⚠️ 82.040 Bayt Yığın Kullanmanın Kötü Bir Uygulama Olmasının Nedeni
🧠 1. Sınırlı Yığın Boyutu (Genellikle Windows'ta 1 MB)

Bir Windows programındaki her iş parçacığının varsayılan yığın boyutu 1 MB'tır (açıkça artırmadığınız sürece). Yani:

    ~82 KB kullanmak = tüm yığının ~%8'i.
    Bu tehlikelidir, özellikle de birden fazla iş parçacığının kendi yığınını aldığı yinelemeli işlevlerde veya çok iş parçacıklı programlarda.
    Daha kötüsü, bu büyük bir parça kullanan tek işlev olmayabilir; birden fazla büyük yığın işlevi hızla yığın taşması çökmelerine yol açabilir.

🔥 2. Yığın Taşması = Sessiz veya Hata Ayıklaması Zor Çökmeler

Başarısız olduklarında nullptr döndüren yığın tahsislerinin (new/malloc) aksine, yığın taşmaları genellikle anında çökmeye neden olur (genellikle bir hata ayıklayıcı eklenmediği sürece yararlı bir mesaj olmadan).

Belirtiler:

    İşlev çağrıları sırasında rastgele çökmeler.
    Yalnızca büyük resimler veya varlıklarla gerçekleşir.
    Debug'da çalışır ancak Release'de çöker (farklı yığın boyutları veya optimizasyonlar nedeniyle).

💾 3. Yığın Küçük, Kısa Ömürlü Veriler İçindir

Yığın şunlar için tasarlanmıştır:

    İşlev parametreleri
    Dönüş adresleri
    Küçük yerel değişkenler

Büyük tamponlar (256×256 resimler gibi) gigabaytlarca veri tutabilen ve dinamik olarak yönetilen yığın için daha uygundur.

EN:
⚠️ Why Using 82,040 Bytes of Stack Is Bad Practice
🧠 1. Limited Stack Size (Typically 1 MB on Windows)

Each thread in a Windows program has a default stack size of 1 MB (unless you explicitly increase it). So:

    Using ~82 KB = ~8% of the entire stack.
    This is dangerous, especially in recursive functions or multi-threaded programs, where multiple threads each get their own stack.
    Worse, this may not be the only function that uses a large chunk — multiple large-stack functions can quickly lead to stack overflow crashes.

🔥 2. Stack Overflow = Silent or Hard-to-Debug Crashes

Unlike heap allocations (new/malloc), which will return nullptr if they fail, stack overflows usually cause an instant crash (often with no helpful message unless a debugger is attached).

Symptoms:

    Random crashes during function calls.
    Only happens with large images or assets.
    Works in Debug but crashes in Release (due to different stack sizes or optimizations).

💾 3. The Stack Is for Small, Short-Lived Data

The stack is designed for:

    Function parameters
    Return addresses
    Small local variables

Large buffers (like 256×256 images) are better suited for the heap, which can hold gigabytes of data and is dynamically managed.

Nasıl yapılır:
Alıntılarda özel içerikler gözükmez.


Böylece Stack'teki en az 180,396byte(176kb) veriyi Heap'e taşıdık.
Öncelikle paylaşım için teşekkürler,
Peki ne değişti ?
 
Yazmışım ya :D stack'teki fazla büyük objeleri heap'e aldım.
Böyle paylaşımlar görünce alakasız konuları kafaya takıp araştırıyorum çok vakit harcıyorum C6262 uyarı kodunu aratınca detayları çıkıyor sanırım windows için stack limiti 1mb imiş, bunu doldurursanda stackoverflow yaşayıp memory corruption yaşıyormuşsun yani undefined behaviour, paylaşım için teşekkürler vizyon açıcı içerikler :)
 
Yazmışım ya :D stack'teki fazla büyük objeleri heap'e aldım.
Cano konuyu okudum zaten de tam anlayamadım neden böyle birşeye ihtiyaç duyuyoruz diye o yüzden sordum. İnternette biraz araştırdım. Chatgpt ile de konuştum. Yararlı içerik. Beyin açıcı, konu için teşekkürler. 😇😍
 
Cano konuyu okudum zaten de tam anlayamadım neden böyle birşeye ihtiyaç duyuyoruz diye o yüzden sordum. İnternette biraz araştırdım. Chatgpt ile de konuştum. Yararlı içerik. Beyin açıcı, konu için teşekkürler. 😇😍
Benim de çok anladığım yok ki :D ondan yapay zeka en iyi dostun burada
 
Bu cidden çok yararlı bir konu bu arada aslında bu tarz optimizasyonlar 2003-2004'ten yazılan kodları düzeltmek ve iyileştirmek çok önemli bence ve özellikle yapay zeka kullanımını bu şekilde yapmanız beni cezbediyor sürekli elinize sağlık. Bence sistem paylaşmaktansa bu tarz paylaşımlar çok çok daha önemli
 
Geri
Üst