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

หน่วยความจำหมายถึงอุปกรณ์ทางกายภาพที่ใช้ในการจัดเก็บโปรแกรมหรือข้อมูลบนพื้นฐานชั่วคราวหรือถาวรสำหรับใช้ในคอมพิวเตอร์หรืออุปกรณ์อิเล็กทรอนิกส์ดิจิตอลอื่น ๆ

10
เป็นความคิดที่ดีที่จะบังคับให้มีการรวบรวมขยะเมื่อใด
ดังนั้นผมอ่านคำถามเกี่ยวกับการบังคับให้ C # เก็บขยะในการทำงานที่เกือบทุกคำตอบเดียวเหมือนกัน: คุณสามารถทำมัน แต่คุณไม่ควร - ยกเว้นบางกรณีที่หายากมาก น่าเศร้าที่ไม่มีใครมีรายละเอียดเกี่ยวกับกรณีเช่นนี้ คุณช่วยบอกฉันได้ไหมว่ามันเป็นความคิดที่ดีหรือสมเหตุสมผลในการจัดเรียงขยะ? ฉันไม่ได้ขอเฉพาะกรณี C # แต่ทุกภาษาโปรแกรมที่มีตัวเก็บขยะ ฉันรู้ว่าคุณไม่สามารถบังคับให้ GC กับทุกภาษาเช่น Java ได้ แต่ลองสมมติว่าคุณทำได้

15
เมื่อใดจึงควรปรับให้เหมาะสมสำหรับหน่วยความจำและประสิทธิภาพความเร็วสำหรับวิธีการ?
ฉันเพิ่งสัมภาษณ์ที่อเมซอน ในระหว่างเซสชันการเข้ารหัสผู้สัมภาษณ์ถามว่าทำไมฉันถึงประกาศตัวแปรในวิธีหนึ่ง ฉันอธิบายกระบวนการของฉันและเขาท้าทายให้ฉันแก้ปัญหาเดียวกันโดยมีตัวแปรน้อยลง ยกตัวอย่างเช่น (นี่คือไม่ได้มาจากการสัมภาษณ์) ผมเริ่มต้นด้วยวิธี A:แล้วดีขึ้นก็จะวิธีการ Bint sโดยการเอา เขายินดีและกล่าวว่าวิธีนี้จะลดการใช้หน่วยความจำด้วยวิธีนี้ ฉันเข้าใจตรรกะเบื้องหลัง แต่คำถามของฉันคือ: เมื่อใดจึงเหมาะสมที่จะใช้วิธี A กับวิธี B และในทางกลับกัน คุณจะเห็นว่าA วิธีการที่เป็นไปได้ใช้หน่วยความจำที่สูงขึ้นเนื่องจากint sมีการประกาศ a + bแต่มันเท่านั้นที่มีการดำเนินการอย่างใดอย่างหนึ่งในการคำนวณคือ ในทางกลับกันวิธีการ Bมีการใช้หน่วยความจำลดลง แต่ต้องทำการคำนวณa + bสองครั้งคือสองครั้ง ฉันจะใช้เทคนิคหนึ่งเหนือเทคนิคอื่นได้อย่างไร หรือเป็นหนึ่งในเทคนิคที่ต้องการมากกว่าเสมอ? สิ่งที่ต้องพิจารณาเมื่อประเมินทั้งสองวิธีมีอะไรบ้าง วิธี A: private bool IsSumInRange(int a, int b) { int s = a + b; if (s > 1000 …

6
หน่วยความจำ Stack และ Heap ใน Java
ดังที่ฉันเข้าใจใน Java หน่วยความจำสแต็คจะเก็บข้อมูลพื้นฐานและวิธีการเรียกใช้และหน่วยความจำฮีปใช้เพื่อจัดเก็บวัตถุ สมมติว่าฉันมีชั้นเรียน class A { int a ; String b; //getters and setters } ดั้งเดิมaในชั้นเรียนAจะถูกเก็บไว้ที่ไหน เหตุใดหน่วยความจำฮีปจึงมีอยู่ทั้งหมด ทำไมเราไม่เก็บทุกอย่างไว้ในกองซ้อน? เมื่อวัตถุได้รับการรวบรวมขยะสแต็กที่เกี่ยวข้องกับวัตถุที่ถูกทำลายจะถูกจัดเก็บหรือไม่?

6
เหตุใดจึงยังคงเป็นส่วนหนึ่งของภาษา Java เมื่อแนะนำเป็นสองเท่าแทน?
ในทุกที่ที่ฉันดูมันบอกว่าdoubleมันยอดเยี่ยมกว่าfloatในเกือบทุกด้าน floatถูกทำให้ล้าสมัยโดยdoubleใน Java ดังนั้นทำไมมันยังคงใช้? ฉันเขียนโปรแกรมเป็นจำนวนมากกับ Libgdx และพวกเขาบังคับให้คุณใช้float(deltaTime, ฯลฯ ) แต่ดูเหมือนว่าสำหรับฉันแล้วdoubleมันจะง่ายกว่าที่จะทำงานด้วยในแง่ของการจัดเก็บและหน่วยความจำ ฉันยังอ่านเมื่อคุณใช้การลอยและเมื่อคุณใช้สองครั้งแต่ถ้าfloatเป็นจริงที่ดีสำหรับตัวเลขที่มีตัวเลขจำนวนมากหลังจากจุดทศนิยมแล้วทำไมเราไม่สามารถใช้หนึ่งในหลายรูปแบบของdouble? มีเหตุผลว่าทำไมคนอื่นยืนยันที่จะใช้ลอยแม้ว่ามันจะไม่ได้ประโยชน์อีกต่อไป? มันเป็นงานมากเกินไปที่จะเปลี่ยนแปลงทั้งหมดหรือไม่

11
คุณจัดการกับการชุบแข็งในอวกาศหรือไม่?
ฉันกระตือรือร้นที่จะศึกษาวิธีปฏิบัติที่ดีที่สุดเมื่อมันมาถึงการทำให้พื้นที่แข็ง ตัวอย่างเช่นฉันได้อ่าน (แม้ว่าฉันจะไม่สามารถหาบทความได้อีกต่อไป) ว่าบางส่วนหลักของรถแลนด์โรเวอร์ Mars ไม่ได้ใช้การจัดสรรหน่วยความจำแบบไดนามิกในความเป็นจริงมันเป็นสิ่งต้องห้าม ฉันได้อ่านด้วยว่าหน่วยความจำหลักแบบเก่าอาจจะเหมาะสมกว่าในอวกาศ ฉันกำลังดูโปรเจ็กต์บางอย่างที่เกี่ยวข้องกับ Google Lunar Challenge และสงสัยว่ามันจะรู้สึกอย่างไรที่ได้โค้ดบนดวงจันทร์หรือแม้แต่ในอวกาศ ฉันรู้ว่าบอร์ดที่มีพื้นที่แข็งมีความมีสติในสภาพแวดล้อมที่รุนแรงเช่นนี้อย่างไรก็ตามฉันสงสัยว่า (ในฐานะโปรแกรมเมอร์ C) ฉันจะต้องปรับความคิดและรหัสของฉันอย่างไรถ้าฉันเขียนสิ่งที่จะวิ่งในอวกาศ ฉันคิดว่าอีกไม่กี่ปีข้างหน้าอาจมีการเติบโตมากขึ้นใน บริษัท ที่ให้บริการพื้นที่ส่วนตัวฉันต้องการที่จะมีความรู้เกี่ยวกับแนวปฏิบัติที่ดีที่สุด จะเกิดอะไรขึ้นกับโปรแกรมถ้าการแผ่รังสีความเย็นหรือความร้อนถล่มบอร์ดที่สร้างความเสียหายต่อฉนวน ฉันคิดว่าเป้าหมายคือการทำให้มนุษย์อยู่ในยานอวกาศ (เท่าที่ซ่อมหรือเปลี่ยนสิ่งของ) และหลีกเลี่ยงภารกิจเพื่อแก้ไขสิ่งต่าง ๆ นอกจากนี้หากคณะกรรมการรักษาระบบที่สำคัญบางคำเตือนก่อนดูเหมือนยิ่ง เราจะได้รับประสบการณ์นี้ได้อย่างไรจากการทดสอบและทดลองใช้ & ข้อผิดพลาด (ยกเว้นการเปิดตัวดาวเทียมส่วนตัวของคุณเอง)
62 c  memory 

6
เหตุใดหน่วยความจำแคช CPU จึงเร็ว
อะไรทำให้หน่วยความจำแคช CPU เร็วกว่าหน่วยความจำหลักมาก ฉันเห็นประโยชน์บางอย่างในระบบแคชแบบทำเป็นชั้น ทำให้รู้สึกว่าแคชที่เล็กลงนั้นเร็วกว่าการค้นหา แต่ต้องมีมากกว่านี้
58 memory  caching 

5
“ ระดับ 256 บั๊ก” ในเกม Pacman สามารถถูกพิจารณาว่าเป็นเซกฟอลต์ที่ไม่มีการจัดการได้หรือไม่?
ฉันกำลังพยายามอธิบายข้อผิดพลาดในการแบ่งกลุ่มกับใครบางคนและฉันกำลังคิดถึงระดับ kill-screen ระดับ 256 ใน Pacman และวิธีที่มันถูกทริกเกอร์โดยจำนวนเต็มล้นและพฤติกรรมที่คล้ายคลึงกันคือ ความผิด ฉันต้องการบอกว่านี่เป็นตัวอย่างที่ดีของสิ่งที่ฉันเรียกว่า "segfault ที่ไม่สามารถจัดการได้" แต่ฉันอยากได้ความเห็นที่สองก่อนที่ฉันจะแพร่กระจายข้อมูลที่ผิดไป ฉันพยายามค้นหามัน แต่ทั้งหมดที่ฉันได้รับคือเอกสารเกี่ยวกับตัวมันเองรวมถึงความร่วมมือระหว่าง Hipster Whale และ Namco ดังนั้นคุณจะพิจารณาพฤติกรรมในระดับ 256 ของ Pacman ว่าเป็นตัวอย่างของการละเมิดการแบ่งส่วนที่ไม่ได้จัดการหรือไม่
51 memory  errors 

3
ทำไมเรายังคงเติบโตสแต็คย้อนหลังได้
เมื่อทำการคอมไพล์รหัส C และดูแอสเซมบลีมันทั้งหมดจะมีสแต็กเติบโตแบบย้อนกลับดังนี้: _main: pushq %rbp movl $5, -4(%rbp) popq %rbp ret -4(%rbp)- หมายความว่าตัวชี้ฐานหรือตัวชี้สแต็คกำลังเคลื่อนย้ายที่อยู่หน่วยความจำแทนที่จะไปขึ้นหรือไม่? ทำไมถึงเป็นอย่างนั้น? ฉันเปลี่ยน$5, -4(%rbp)ไป$5, +4(%rbp)คอมไพล์และรันโค้ดและไม่มีข้อผิดพลาด เหตุใดเราจึงต้องย้อนกลับไปในหน่วยความจำสแต็ค
46 c  memory  assembly 

4
เก็บค่า Null ไว้ที่ไหนหรือเก็บไว้ที่ไหน?
ฉันต้องการเรียนรู้เกี่ยวกับค่า Null หรือการอ้างอิง Null ตัวอย่างเช่นฉันมีคลาสที่เรียกว่า Apple และฉันสร้างอินสแตนซ์ของมัน Apple myApple = new Apple("yummy"); // The data is stored in memory จากนั้นฉันกินแอปเปิ้ลนั้นและตอนนี้มันต้องเป็นโมฆะดังนั้นฉันตั้งมันเป็นโมฆะ myApple = null; หลังจากสายนี้ฉันลืมว่าฉันกินมันและตอนนี้ต้องการตรวจสอบ bool isEaten = (myApple == null); ด้วยการโทรนี้การอ้างอิง myApple อยู่ที่ไหน เป็นค่าตัวชี้พิเศษหรือไม่ ถ้าเป็นเช่นนั้นถ้าฉันมีวัตถุ 1,000 NULL พวกเขาครอบครองพื้นที่หน่วยความจำวัตถุ 1,000 หรือ 1,000 พื้นที่หน่วยความจำ int ถ้าเราคิดว่าประเภทตัวชี้เป็น int?
39 memory  null 

8
ใน C ++ เวลาโปรแกรมเมอร์ที่ใช้ในการจัดการหน่วยความจำ
คนที่เคยชินกับภาษาที่รวบรวมขยะมักจะกลัวการจัดการหน่วยความจำของ C ++ มีเครื่องมือเช่นauto_ptrและshared_ptrที่จะจัดการงานการจัดการหน่วยความจำมากมายสำหรับคุณ ไลบรารี C ++ จำนวนมากลงวันที่ก่อนวันจริงเครื่องมือเหล่านี้และมีวิธีของตัวเองในการจัดการงานการจัดการหน่วยความจำ คุณใช้เวลากับงานการจัดการหน่วยความจำนานเท่าใด ฉันสงสัยว่ามันขึ้นอยู่กับชุดของห้องสมุดที่คุณใช้อย่างมากดังนั้นโปรดบอกว่าคำตอบที่คุณใช้กับคนใดและถ้าพวกเขาทำให้ดีขึ้นหรือแย่ลง
39 c++  memory 

10
ความแตกต่างระหว่างตัวแปรและตำแหน่งหน่วยความจำคืออะไร? [ปิด]
เมื่อเร็ว ๆ นี้ฉันพยายามอธิบายพอยน์เตอร์ด้วยวิธีภาพเป็นแฟลชการ์ด คำถาม 001:นี่คือภาพวาดของตำแหน่งในหน่วยความจำคอมพิวเตอร์ มันเป็นความจริง0x23452หรือไม่ที่อยู่ของมันคือ ทำไม? คำตอบ:ใช่เพราะ0x23452อธิบายว่าคอมพิวเตอร์สามารถหาตำแหน่งนี้ได้จากที่ใด คำถาม 002:จริงหรือไม่ที่ตัวละครbนั้นถูกเก็บไว้ในตำแหน่งหน่วยความจำ0x23452? ทำไม? คำตอบ:ไม่เพราะตัวละครaจะถูกเก็บไว้ข้างใน คำถามที่ 003:มันคือความจริงที่เป็นตัวชี้ที่เก็บไว้ภายในที่ตั้งหน่วยความจำ0x23452? ทำไม? คำตอบ:ใช่เพราะที่อยู่ของตำแหน่งหน่วยความจำ0x34501ถูกเก็บไว้ข้างใน คำถามที่ 004:มันคือความจริงที่เป็นตัวชี้ที่เก็บไว้ภายในที่ตั้งหน่วยความจำ0x23452? ทำไม? คำตอบ:ใช่เพราะที่อยู่ของตำแหน่งหน่วยความจำอื่นจะถูกเก็บไว้ข้างใน ตอนนี้สำหรับส่วนที่ทำให้ฉันกังวล วิศวกรซอฟต์แวร์อธิบายพอยน์เตอร์ให้ฉันเช่นนี้: ตัวชี้เป็นตัวแปรที่มีค่าเป็นที่อยู่หน่วยความจำของตัวแปรอื่น จาก FlashCards ทั้งสี่ที่ฉันแสดงให้คุณเห็นทั้งหมดฉันจะกำหนดพอยน์เตอร์ด้วยวิธีที่แตกต่างกันเล็กน้อย: ตัวชี้คือตำแหน่งหน่วยความจำที่มีค่าเป็นที่อยู่หน่วยความจำของตำแหน่งหน่วยความจำอื่น มันปลอดภัยหรือไม่ที่จะบอกว่าตัวแปรนั้นเหมือนกับตำแหน่งหน่วยความจำหรือไม่? ถ้าไม่เช่นนั้นใครถูก ความแตกต่างระหว่างตัวแปรและตำแหน่งหน่วยความจำคืออะไร?

1
ประสิทธิภาพของรหัส ADT ที่มุ่งเน้นการกำหนดเดียวบน CPU ที่ทันสมัย
การทำงานกับข้อมูลที่ไม่เปลี่ยนรูปแบบด้วยการมอบหมายครั้งเดียวมีผลชัดเจนที่ต้องใช้หน่วยความจำมากขึ้นอย่างใดอย่างหนึ่งจะเข้าใจเพราะคุณกำลังสร้างค่าใหม่อย่างต่อเนื่อง(แม้ว่าคอมไพเลอร์ภายใต้ฝาครอบทำเคล็ดลับตัวชี้ แต่ฉันเคยได้ยินสองสามครั้งในขณะนี้ว่าการสูญเสียที่เกิดขึ้นกับประสิทธิภาพนั้นมีมากกว่าเมื่อได้รับประโยชน์จากวิธีการที่ CPU (ตัวควบคุมหน่วยความจำของมันโดยเฉพาะ) สามารถใช้ประโยชน์จากความจริงที่ว่าหน่วยความจำไม่ได้กลายพันธุ์ ฉันหวังว่าจะมีใครซักคนที่จะเข้าใจว่าเรื่องนี้เกิดขึ้นจริงได้อย่างไร (หรือถ้าไม่ใช่) ในความคิดเห็นในโพสต์อื่นถูกกล่าวถึงว่าAbstract Data Types (ADT's) เกี่ยวข้องกับสิ่งนี้ซึ่งทำให้ฉันอยากรู้เพิ่มเติมว่า ADT มีผลเฉพาะวิธีที่ CPU ใช้กับหน่วยความจำอย่างไร อย่างไรก็ตามนี่เป็นสิ่งที่แยกกันส่วนใหญ่ฉันแค่สนใจว่าความบริสุทธิ์ของภาษานั้นมีผลต่อประสิทธิภาพของ CPU และแคช ฯลฯ อย่างไร

5
หากตัวเลขมีขนาดใหญ่เกินไปมันจะกระจายไปยังตำแหน่งหน่วยความจำถัดไปหรือไม่
ฉันได้รับการตรวจสอบการเขียนโปรแกรม C และมีเพียงสองสามสิ่งที่รบกวนฉัน ลองทำโค้ดนี้กันตัวอย่าง: int myArray[5] = {1, 2, 2147483648, 4, 5}; int* ptr = myArray; int i; for(i=0; i<5; i++, ptr++) printf("\n Element %d holds %d at address %p", i, myArray[i], ptr); ฉันรู้ว่า int สามารถมีค่าสูงสุดเป็นบวก 2,147,483,647 ดังนั้นเมื่อทำอย่างนั้นมันจะ "ล้น" ไปยังที่อยู่หน่วยความจำถัดไปซึ่งทำให้องค์ประกอบ 2 ปรากฏเป็น "-2147483648" ที่ที่อยู่นั้นหรือไม่ แต่นั่นก็ไม่สมเหตุสมผลเพราะในผลลัพธ์มันยังบอกว่าที่อยู่ถัดไปเก็บค่า 4 จากนั้น 5 ถ้าจำนวนที่หกไปยังที่อยู่ถัดไปนั่นจะไม่เปลี่ยนค่าที่เก็บไว้ที่ที่อยู่นั้น ? …

2
เหตุใด C สตริงตัวอักษรอ่านอย่างเดียว?
ข้อได้เปรียบของสตริงตัวอักษรที่อ่านได้อย่างเดียวคืออะไร (-ies / -ied): อีกวิธีในการยิงตัวเองที่เท้า char *foo = "bar"; foo[0] = 'd'; /* SEGFAULT */ ไม่สามารถเริ่มต้นอาร์เรย์ของคำอ่าน - เขียนได้อย่างหรูหราในหนึ่งบรรทัด: char *foo[] = { "bar", "baz", "running out of traditional placeholder names" }; foo[1][2] = 'n'; /* SEGFAULT */ ภาษาที่ซับซ้อนนั้นเอง char *foo = "bar"; char var[] = "baz"; some_func(foo); /* VERY DANGEROUS! …
29 c  memory  strings 

8
เป็นไปได้ที่จะทำนายแบบคงที่เมื่อมีการจัดสรรคืนหน่วยความจำ --- จากซอร์สโค้ดเท่านั้นหรือไม่
หน่วยความจำ (และล็อคทรัพยากร) จะถูกส่งคืนไปยังระบบปฏิบัติการที่จุดที่กำหนดไว้ระหว่างการทำงานของโปรแกรม โฟลว์การควบคุมของโปรแกรมด้วยตัวเองนั้นเพียงพอที่จะรู้ว่าสามารถจัดสรรคืนทรัพยากรที่กำหนดได้อย่างแน่นอน เช่นเดียวกับที่โปรแกรมเมอร์มนุษย์รู้จักที่จะเขียนfclose(file)เมื่อทำโปรแกรมด้วย GCs แก้ปัญหานี้โดยการหาโดยตรงระหว่างรันไทม์เมื่อโฟลว์ควบคุมถูกดำเนินการ แต่แหล่งที่แท้จริงของความจริงเกี่ยวกับการควบคุมการไหลคือแหล่งที่มา ในทางทฤษฎีมันควรจะเป็นไปได้ที่จะกำหนดตำแหน่งที่จะแทรกการfree()เรียกก่อนที่จะรวบรวมโดยการวิเคราะห์แหล่งที่มา (หรือ AST) การนับการอ้างอิงเป็นวิธีที่ชัดเจนในการใช้สิ่งนี้ แต่ก็เป็นเรื่องง่ายที่จะพบกับสถานการณ์ที่ตัวชี้ยังคงอ้างอิง (ยังอยู่ในขอบเขต) แต่ไม่ต้องการอีกต่อไป สิ่งนี้เพียงแปลงความรับผิดชอบของการยกเลิกการจัดสรรพอยน์เตอร์ด้วยตนเองเป็นความรับผิดชอบในการจัดการขอบเขต / การอ้างอิงด้วยตนเองกับพอยน์เตอร์เหล่านั้น ดูเหมือนว่าเป็นไปได้ที่จะเขียนโปรแกรมที่สามารถอ่านซอร์สของโปรแกรมและ: ทำนายการเรียงสับเปลี่ยนทั้งหมดของโฟลว์การควบคุมของโปรแกรม --- ไปยังความแม่นยำที่คล้ายกันในขณะที่ดูการทำงานจริงของโปรแกรม ติดตามการอ้างอิงทั้งหมดไปยังทรัพยากรที่จัดสรร สำหรับการอ้างอิงแต่ละครั้งให้ตรวจสอบการไหลของการควบคุมที่ตามมาทั้งหมดเพื่อหาจุดเริ่มต้นที่การอ้างอิงนั้นรับประกันว่าจะไม่ถูกยกเลิกการลงทะเบียน ณ จุดนั้นให้แทรกคำสั่งจัดสรรคืนที่บรรทัดของซอร์สโค้ด มีอะไรอีกไหมที่ทำสิ่งนี้แล้ว? ฉันไม่คิดว่าตัวชี้สมาร์ท Rust หรือ C ++ / RAII เป็นสิ่งเดียวกัน
27 parsing  memory 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.