คำถามติดแท็ก stack-memory

8
อันตรายเมื่อสร้างเธรดที่มีขนาดสแต็ก 50x เป็นค่าเริ่มต้นคืออะไร
ขณะนี้ฉันกำลังทำงานกับโปรแกรมที่มีประสิทธิภาพสูงและหนึ่งเส้นทางที่ฉันตัดสินใจสำรวจซึ่งอาจช่วยลดการใช้ทรัพยากรคือการเพิ่มขนาดสแต็กของเธรดของผู้ปฏิบัติงานเพื่อให้ฉันสามารถย้ายข้อมูลส่วนใหญ่float[]ที่ฉันจะเข้าสู่ สแต็ก (ใช้stackalloc) ฉันได้อ่านแล้วว่าขนาดสแต็กเริ่มต้นสำหรับเธรดคือ 1 MB ดังนั้นเพื่อย้ายทั้งหมดของfloat[]ฉันฉันจะต้องขยายสแต็กประมาณ 50 ครั้ง (ถึง 50 MB ~) ฉันเข้าใจว่าโดยทั่วไปถือว่าเป็น "ไม่ปลอดภัย" และไม่แนะนำ แต่หลังจากทำการเปรียบเทียบโค้ดปัจจุบันของฉันกับวิธีนี้ฉันพบว่าความเร็วในการประมวลผลเพิ่มขึ้น530% ! ดังนั้นฉันจึงไม่สามารถผ่านตัวเลือกนี้ได้โดยไม่ต้องตรวจสอบเพิ่มเติมซึ่งทำให้ฉันมีคำถาม สิ่งที่เป็นอันตรายที่เกี่ยวข้องกับการเพิ่มสแต็คให้มีขนาดใหญ่ (สิ่งที่อาจผิดไป) และฉันควรระมัดระวังอะไรบ้างเพื่อลดอันตรายดังกล่าว รหัสทดสอบของฉัน public static unsafe void TestMethod1() { float* samples = stackalloc float[12500000]; for (var ii = 0; ii < 12500000; ii++) { samples[ii] = 32768; } } public …
228 c#  .net  memory  stack-memory 

6
มีการจัดรูปแบบอาร์เรย์หลายมิติในหน่วยความจำอย่างไร
ใน C ฉันรู้ว่าฉันสามารถจัดสรรอาเรย์สองมิติแบบไดนามิกบนฮีปโดยใช้โค้ดต่อไปนี้: int** someNumbers = malloc(arrayRows*sizeof(int*)); for (i = 0; i < arrayRows; i++) { someNumbers[i] = malloc(arrayColumns*sizeof(int)); } เห็นได้ชัดว่าสิ่งนี้สร้างอาร์เรย์พอยน์เตอร์หนึ่งมิติไปยังอาร์เรย์จำนวนเต็มหนึ่งมิติที่แยกจากกันและ "ระบบ" สามารถหาสิ่งที่ฉันหมายถึงเมื่อฉันขอ: someNumbers[4][2]; แต่เมื่อฉันประกาศอาร์เรย์ 2 มิติแบบคงที่ดังในบรรทัดต่อไปนี้ ... : int someNumbers[ARRAY_ROWS][ARRAY_COLUMNS]; ... โครงสร้างที่คล้ายกันนี้ถูกสร้างขึ้นบนสแต็กหรือเป็นรูปแบบอื่นอย่างสมบูรณ์หรือไม่ (เช่นเป็นตัวชี้อาร์เรย์ 1D หรือไม่ถ้าไม่ใช่มันคืออะไรและการอ้างอิงถึงมันคิดออกได้อย่างไร) นอกจากนี้เมื่อฉันพูดว่า "ระบบ" อะไรคือสิ่งที่ต้องรับผิดชอบในการหาสิ่งนั้น เคอร์เนล หรือคอมไพเลอร์ C เรียงลำดับขณะคอมไพล์หรือไม่?

5
การจัดสรร stack vs heap ของ structs ใน Go และความเกี่ยวข้องกับการรวบรวมขยะ
ฉันยังใหม่กับ Go และฉันรู้สึกสับสนเล็กน้อยระหว่างการเขียนโปรแกรมแบบ C-style โดยที่ตัวแปรอัตโนมัติอยู่บนสแต็กและการจัดสรรหน่วยความจำจะมีชีวิตอยู่บนฮีปและการเขียนโปรแกรมแบบสแต็กตาม Python สิ่งเดียวที่อยู่บนสแต็กคือการอ้างอิง / พอยน์เตอร์ไปยังวัตถุบนฮีป เท่าที่ฉันสามารถบอกได้ฟังก์ชั่นทั้งสองต่อไปนี้ให้ผลลัพธ์เหมือนกัน: func myFunction() (*MyStructType, error) { var chunk *MyStructType = new(HeaderChunk) ... return chunk, nil } func myFunction() (*MyStructType, error) { var chunk MyStructType ... return &chunk, nil } เช่นจัดสรรโครงสร้างใหม่และส่งคืน ถ้าฉันเขียนว่าใน C วัตถุแรกจะวางวัตถุบนกองและอันที่สองจะวางบนกอง ตัวแรกจะกลับตัวชี้ไปที่กองที่สองจะกลับตัวชี้ไปที่กองซึ่งจะระเหยไปตามเวลาที่ฟังก์ชันส่งคืนซึ่งจะเป็นสิ่งที่ไม่ดี ถ้าฉันเขียนมันด้วยภาษาไพ ธ อน (หรือภาษาสมัยใหม่อื่น ๆ อีกมากมายยกเว้น C …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.