ประเภทที่เฉพาะเจาะจงยังคงมีความจำเป็น?


20

สิ่งหนึ่งที่เกิดขึ้นกับฉันในวันอื่น ๆ คือประเภทที่เฉพาะเจาะจงยังคงมีความจำเป็นหรือเป็นมรดกตกทอดเรา สิ่งที่ฉันหมายถึงคือเราต้องการสั้น, int, long, bigint ฯลฯ หรือไม่

ฉันเข้าใจถึงเหตุผลตัวแปร / วัตถุถูกเก็บไว้ในหน่วยความจำจำเป็นต้องจัดสรรหน่วยความจำและดังนั้นเราจึงจำเป็นต้องรู้ว่าตัวแปรมีขนาดใหญ่ได้อย่างไร แต่จริงๆแล้วภาษาการเขียนโปรแกรมสมัยใหม่ไม่ควรที่จะจัดการกับ "ชนิดปรับตัว" เช่นถ้าบางสิ่งบางอย่างที่เคยจัดสรรในช่วง shortint จะใช้ไบต์น้อยลงและหากมีการจัดสรรบางสิ่งบางอย่างในจำนวนที่มากหน่วยความจำจะถูกจัดสรร สำหรับตัวอย่างนั้น

โฟลตของจริงและดับเบิลนั้นค่อนข้างเลื่องลือเพราะประเภทนั้นขึ้นอยู่กับความแม่นยำที่คุณต้องการ สตริงควรจะสามารถใช้หน่วยความจำน้อย upp ในหลาย ๆ กรณี (ใน. Net) ที่ส่วนใหญ่ ascii ใช้สตริง buth ใช้หน่วยความจำสองเท่าเพราะการเข้ารหัสแบบ unicode

อาร์กิวเมนต์หนึ่งสำหรับประเภทที่เฉพาะเจาะจงอาจเป็นเพราะมันเป็นส่วนหนึ่งของสเปคเช่นเช่นตัวแปรไม่ควรใหญ่กว่าค่าที่แน่นอนดังนั้นเราจึงตั้งค่าให้เป็น shortint แต่ทำไมไม่มีข้อ จำกัด ประเภทแทน? มันจะมีความยืดหยุ่นและทรงพลังมากขึ้นในการตั้งช่วงและค่าที่อนุญาตสำหรับตัวแปร (และคุณสมบัติ)

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


6
PHP, Ruby, Perl และอื่น ๆ ไม่ต้องการให้คุณระบุประเภทของตัวแปร สภาพแวดล้อมเป็นสิ่งที่เหมาะสมสำหรับคุณ
FrustratedWithFormsDesigner

7
สตริง Unicode ไม่จำเป็นต้องใช้หน่วยความจำเพิ่มเติมเมื่อเกิดขึ้นเพื่อใช้สำหรับ ASCII เท่านั้น (UTF-8)

2
แต่มีความแตกต่างระหว่าง IMO แบบแปรผันและแบบปรับได้ ตัวแปรจะไม่ถูกพิมพ์เลย แต่จะได้รับการพิมพ์เมื่อได้รับมอบหมายในขณะที่ประเภทการปรับตัวจะถูกพิมพ์ แต่มากขึ้นอย่างอิสระ (และผมชอบแนวคิดของประเภท จำกัด )
Homde

สิ่งนี้ทำให้ฉันนึกถึงโครงการนี้: tom.lokhorst.eu/media/…
LennyProgrammers

4
แล้วอาดาล่ะ? type hour is range 0 .. 23;
mouviciel

คำตอบ:


12

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

มันไม่ได้แทนที่ประสิทธิภาพการเขียนโปรแกรมที่สำคัญ มันเป็นเพียงการเขียนโปรแกรมที่ไม่ใช่ประสิทธิภาพที่สำคัญยิ่งกว่า


1
ตรวจสอบรหัสสัญญาใน. NET 4.0
Steven Jeuris

+1 เมื่อพูดถึงการจัดเก็บข้อมูล / การส่งข้อมูล (เช่นเครือข่าย) ข้อ จำกัด นั้นเป็นพื้นฐานในการเพิ่มประสิทธิภาพของโปรโตคอล / การนำไปใช้ให้เกิดประโยชน์สูงสุด นอกจากนี้ยังมีจำนวนมากที่ต้องได้รับหากมีคอลเลกชันที่พิมพ์ นอกเหนือจากนั้นมันปลอดภัยที่จะถือว่าประสิทธิภาพสามารถใช้เบาะหลัง (โดยเฉพาะถ้ามันลดโอกาสที่จะเกิดข้อผิดพลาดทางความหมาย)
Evan Plaice

9

Adaptative Types หมายถึงตรรกะในการปรับตัว, หมายถึงการทำงานที่รันไทม์เพื่อรันตรรกะนั้น (การสร้างเทมเพลตและการคอมไพล์เวลาจะต้องใช้ชนิดเฉพาะ, การอนุมานประเภทเป็นกรณีพิเศษที่คุณได้รับสิ่งที่ดีที่สุดในโลกทั้งสอง) งานพิเศษนั้นสามารถใช้ได้ในสภาพแวดล้อมที่การแสดงไม่สำคัญและระบบรักษาขนาดที่เหมาะสม ในสภาพแวดล้อมอื่นมันไม่ใช่ (ระบบฝังตัวเป็นหนึ่งซึ่งบางครั้งคุณต้องใช้ชนิดจำนวนเต็ม 32/64 บิตสำหรับประสิทธิภาพของซีพียูและประเภทจำนวนเต็ม 8/16 บิตสำหรับการเพิ่มประสิทธิภาพการสำรองข้อมูลหน่วยความจำแบบคงที่)

แม้แต่ภาษาที่ใช้งานทั่วไปที่รองรับการเชื่อมโยงล่าช้า (ความละเอียดของประเภทที่รันไทม์เช่น VB6) มีแนวโน้มที่จะส่งเสริมการพิมพ์ที่รัดกุมในขณะนี้ (VB.NET) เนื่องจากประสิทธิภาพการทำงานที่เคยเกิดขึ้นเมื่อถูกผูกมัดช้าและเนื่องจากคุณ ท้ายด้วยรหัสน่าเกลียดเมื่อประเภทไม่ชัดเจน ( อ้างอิง / Professional Refactoring ใน Visual Basic - Danijel Arsenovski )


โปรดกำหนด "การพิมพ์อัตโนมัติ"

@delnan: แทนที่อัตโนมัติพิมพ์ด้วยปลายชผูกพันคือสิ่งที่ผมหมายถึง :)
Matthieu

มีภาษาที่ใช้งานทั่วไปจำนวนมากที่สามารถแก้ไขประเภทที่รันไทม์ Common LISP เพื่อตั้งชื่อภาษาเดียว (สำหรับวัตถุประสงค์ด้านประสิทธิภาพคุณสามารถประกาศประเภทใน Common LISP ดังนั้นคุณสามารถทำได้ในส่วนที่มีความสำคัญต่อประสิทธิภาพเท่านั้น)
David Thornley

@David Thornley: "การบังคับใช้" การพิมพ์ที่รัดกุมอาจจะแรงเกินไป "การส่งเสริม" จะเหมาะสมกว่าและอัปเดตคำตอบของฉันตามนั้น ภาษาที่ให้คุณเลือกระหว่างการผูกมัดทั้งสองแบบขึ้นอยู่กับสถานการณ์นั้นดีกว่าแน่นอนว่าการถูกบังคับในทางใดทางหนึ่ง โดยเฉพาะอย่างยิ่งเมื่อไม่ทำการเขียนโปรแกรมระดับต่ำและเน้นไปที่ตรรกะ
Matthieu

4

ความเรียบง่าย, หน่วยความจำและความเร็ว เมื่อฉันประกาศตัวแปรหน่วยความจำสำหรับตัวแปรนั้นจะถูกจัดสรรในหนึ่งบล็อก เพื่อสนับสนุนตัวแปรที่กำลังเติบโตแบบไดนามิกฉันจะต้องเพิ่มแนวคิดของหน่วยความจำที่ไม่ต่อเนื่องกับตัวแปรนั้น (ไม่ว่าจะเป็นหรือสำรองบล็อกที่ใหญ่ที่สุดที่ตัวแปรสามารถเป็นตัวแทนได้) หน่วยความจำแบบไม่ต่อเนื่องจะลดประสิทธิภาพของการมอบหมาย / การดึง การจัดสรรที่ใหญ่ที่สุดที่เป็นไปได้นั้นจะสิ้นเปลืองในสถานการณ์ที่ฉันต้องการเพียงไบต์ แต่ระบบสงวนไว้นาน

คิดว่าการแลกเปลี่ยนระหว่างอาร์เรย์และเวกเตอร์ (หรือรายการที่เชื่อมโยง) ด้วยอาร์เรย์การค้นหาตำแหน่งที่เฉพาะเจาะจงเป็นเรื่องง่าย ๆ ในการรับตำแหน่งเริ่มต้นและเลื่อนตัวชี้หน่วยความจำช่องว่าง x เพื่อค้นหาตำแหน่งใหม่นั้นในหน่วยความจำ คิดว่า int เป็นบิต [32] การอ่าน int เกี่ยวข้องกับการเดินผ่านอาร์เรย์นั้นเพื่อรับค่าบิตทั้งหมด

ในการสร้างชนิดตัวเลขแบบไดนามิกคุณต้องเปลี่ยนจากอาร์เรย์ของบิตเป็นเวกเตอร์ของบิต การอ่านหมายเลขไดนามิกของคุณเกี่ยวข้องกับการไปที่หัวรับบิตนั้นถามว่าบิตต่อไปอยู่ในหน่วยความจำย้ายไปที่ตำแหน่งนั้นรับบิตนั้น ฯลฯ สำหรับแต่ละบิตในจำนวนไดนามิกคุณกำลังดำเนินการสามอ่าน ( ปัจจุบัน) อ่าน (ที่อยู่ถัดไป) ย้าย (ถัดไป) ลองนึกภาพการอ่านค่าของตัวเลขล้าน นั่นคือการดำเนินงานพิเศษนับล้าน มันอาจดูไม่มีนัยสำคัญ แต่คิดเกี่ยวกับระบบ (เช่นการเงิน) ซึ่งทุก ๆ มิลลิวินาทีสำคัญ

การตัดสินใจที่ทำให้ความรับผิดชอบของนักพัฒนาเพื่อตรวจสอบขนาดและการตรวจสอบคือการแลกเปลี่ยนขนาดเล็กเมื่อเทียบกับผลกระทบต่อประสิทธิภาพของระบบ


1
อีกทางเลือกหนึ่งคือการใช้ตัวเลขที่คล้ายกับ arraylists ซึ่งอาร์เรย์นั้นได้รับการจัดสรรใหม่เมื่อตัวเลขมีขนาดใหญ่กว่าขนาดปัจจุบัน นอกจากนี้คุณต้องพิจารณาถึงกรณีที่ผู้ใช้ต้องการโอเวอร์โฟลว์ลูป
Michael Brown

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

เพื่อความยุติธรรมมันไม่โหดร้ายอย่างที่คุณทำ ตอบคำถามของฉัน
พอลนาธาน

3

จำเป็นต้องใช้ประเภทเฉพาะสำหรับภาษาและโครงการที่เน้นเป็นศูนย์กลาง ตัวอย่างหนึ่งคือ on-the-wire network protocols

แต่ลองสร้าง - เพื่อความสนุก - ประเภท varint ในภาษาอย่าง C ++ สร้างจากnewอาร์เรย์ของ int

ไม่ใช่เรื่องยากที่จะใช้การเพิ่ม: เพียงแค่ xor ไบต์เข้าด้วยกันและตรวจสอบบิตสูง: หากมีการดำเนินการพกพาnewในไบต์บนใหม่และดำเนินการบิต การลบจะตามมาเล็กน้อยในการแสดงส่วนประกอบ 2 (ซึ่งเป็นที่รู้จักกันในชื่อ adder กระเพื่อม)

การคูณมีค่าใกล้เคียงกัน ใช้การเพิ่ม / เปลี่ยนแบบวนซ้ำ และเช่นเคยความบิดที่แท้จริงในหางของคุณคือการหาร [*]

คุณทำอะไรหายไปเมื่อสิ่งนี้เกิดขึ้น?

  • เวลาที่กำหนด คุณมี syscall ( new) ที่อาจก่อให้เกิดจุดที่ไม่สามารถควบคุมได้

  • พื้นที่ที่กำหนด

  • คณิตศาสตร์กึ่งซอฟแวร์ช้า

หากคุณต้องการใช้ภาษาเลเยอร์ของฮาร์ดแวร์และยังต้องใช้งานในระดับสูง (ช้า) และไม่ต้องการฝังเอ็นจิ้นการเขียนสคริปต์varinta สมเหตุสมผลอย่างมาก มันอาจจะเขียนที่ไหนสักแห่ง

[*] อัลกอริทึมทางคณิตศาสตร์ของฮาร์ดแวร์ Cf สำหรับวิธีที่เร็วกว่าในการทำมัน - โดยปกติกลอุบายนั้นจะเป็นการทำงานแบบขนาน


2

นี่เป็นคำถามที่ดี มันอธิบายว่าทำไมภาษาเช่น Python ไม่ต้องการ "short, int, bigint etc. ": จำนวนเต็ม, ดี, จำนวนเต็ม (มีชนิดจำนวนเต็มเดียวใน Python 3) และไม่มีขนาด จำกัด (นอกเหนือจากที่ แน่นอนว่าหน่วยความจำของคอมพิวเตอร์)

สำหรับ Unicode การเข้ารหัส UTF-8 (ซึ่งเป็นส่วนหนึ่งของ Unicode) ใช้อักขระเดียวสำหรับอักขระ ASCII เท่านั้นดังนั้นมันจึงไม่เลว

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


1

บนพื้นฐานของทฤษฎีภาษาคุณพูดถูก ประเภทควรขึ้นอยู่กับชุดของสถานะทางกฎหมายการเปลี่ยนแปลงที่มีให้กับรัฐเหล่านั้นและการดำเนินการที่ทำได้ในรัฐเหล่านั้น

นี่คือสิ่งที่คร่าว ๆ ที่โปรแกรม OOP ในรูปแบบทั่วไปให้อย่างไรก็ตาม ในความเป็นจริงใน Java คุณกำลังพูดถึงBigIntegerและBigDecimalเรียนอย่างมีประสิทธิภาพซึ่งจัดสรรพื้นที่ตามจำนวนที่จำเป็นในการจัดเก็บวัตถุ (ดังที่ FrustratedWithFormsDesigner ตั้งข้อสังเกตภาษาประเภทสคริปต์จำนวนมากยิ่งขึ้นไปตามเส้นทางนี้และไม่จำเป็นต้องมีการประกาศประเภทและจะเก็บสิ่งที่คุณให้พวกเขา)

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


ฉันรู้ว่าการพิมพ์แบบไดนามิก / การปรับตัวบางอย่างดูเหมือนจะมีค่าใช้จ่ายและมีประสิทธิภาพน้อยกว่าที่เรามีอยู่ในขณะนี้และการใช้คอมไพเลอร์ปัจจุบันที่พวกเขาต้องการ แต่เราแน่ใจ 100% ว่าถ้าคุณสร้างภาษาและคอมไพเลอร์จากพื้นดินคุณไม่สามารถทำให้พวกเขาถ้าไม่เร็วเท่าที่พิมพ์แบบคงที่อย่างน้อยเป็นไปได้อย่างรวดเร็วที่จะคุ้มค่า
Homde

1
@MKO: ทำไมคุณไม่ลองดูล่ะ
อานนท์

1
ใช่คุณสามารถทำให้เป็นไปได้อย่างรวดเร็ว (แต่อาจไม่เร็วเท่ากับระบบคงที่สำหรับตัวเลข) แต่ส่วน "มันคุ้มค่า" ส่วนที่ยากกว่านี้ คนส่วนใหญ่ทำงานกับข้อมูลที่มีช่วงที่เหมาะสมในintหรือ a doubleและถ้าไม่พวกเขาก็ตระหนักถึงมันดังนั้นการปรับขนาดค่าแบบไดนามิกจึงเป็นคุณสมบัติที่พวกเขาไม่จำเป็นต้องจ่าย
jprete

ในฐานะที่เป็นโปรแกรมเมอร์ทั้งหมดแน่นอนผมฝันของบางวันทำให้ภาษาของตัวเอง;)
Homde

@ jprete: ฉันไม่เห็นด้วย คนส่วนใหญ่ไม่ทราบถึงผลกลางขนาดใหญ่ที่เป็นไปได้ ภาษาดังกล่าวสามารถและทำให้เร็วพอสำหรับจุดประสงค์ส่วนใหญ่
David Thornley

1

มันขึ้นอยู่กับภาษา สำหรับภาษาระดับสูงกว่าเช่น Python, Ruby, Erlang และเช่นนั้นคุณมีเพียงแนวคิดของจำนวนเต็มและทศนิยม

อย่างไรก็ตามสำหรับบางคลาสของภาษาที่มีประเภทเหล่านี้มีความสำคัญมาก เมื่อคุณกำลังเขียนโค้ดเพื่ออ่านและเขียนรูปแบบไบนารี่เช่น PNG, JPeg เป็นต้นคุณจำเป็นต้องรู้อย่างแม่นยำว่ามีการอ่านข้อมูลเป็นจำนวนเท่าใดในแต่ละครั้ง เช่นเดียวกันกับการเขียนเคอร์เนลระบบปฏิบัติการและไดรเวอร์อุปกรณ์ ไม่ใช่ทุกคนที่ทำสิ่งนี้และในภาษาระดับสูงกว่าพวกเขาใช้ไลบรารี C เพื่อทำการยกของหนักอย่างละเอียด

ในshortยังมีสถานที่สำหรับประเภทที่เฉพาะเจาะจงมากขึ้น แต่ปัญหาการพัฒนาจำนวนมากไม่ต้องการความแม่นยำนั้น


0

ฉันเพิ่งสร้างแลดเดอร์ลอจิกเอดิเตอร์และรันไทม์และฉันตัดสินใจที่จะ จำกัด ประเภท:

  • บูลีน
  • จำนวน
  • เชือก
  • วันเวลา

ฉันเชื่อว่ามันทำให้ใช้งานง่ายขึ้นสำหรับผู้ใช้ นี่คือการออกเดินทางที่รุนแรงจาก PLC ส่วนใหญ่ที่มีประเภท "ปกติ" ทุกประเภทที่คุณเห็นในภาษาเช่น C


0

ภาษาการเขียนโปรแกรมเคลื่อนไปในทิศทางนั้น ใช้สตริงตัวอย่าง ในภาษาเก่าคุณต้องประกาศขนาดของสตริงเช่นPIC X(42)ใน COBOL DIM A$(42)ในบางรุ่นของ BASIC หรือ [ VAR] CHAR(42)ใน SQL ในภาษาสมัยใหม่คุณมีเพียงหนึ่งstringประเภทที่จัดสรรแบบไดนามิกและไม่จำเป็นต้องคำนึงถึงขนาด

อย่างไรก็ตามจำนวนเต็มที่ต่างกัน:

สิ่งที่ฉันหมายถึงคือเราต้องการสั้น, int, long, bigint ฯลฯ หรือไม่

ดู Python มันใช้เพื่อแยกความแตกต่างระหว่างจำนวนเต็มขนาดเครื่อง ( int) และขนาดโดยพลการ ( long) ใน 3.x อดีตหายไป (เก่าlongคือใหม่int) และไม่มีใครคิดถึงมัน

แต่ยังคงมีประเภทเฉพาะสำหรับลำดับของจำนวนเต็ม 8 บิตในรูปแบบของและbytes bytearrayทำไมไม่ใช้ a tupleหรือlistจำนวนเต็มตามลำดับ จริงbytesมีวิธีการแบบสตริงพิเศษที่tupleไม่ได้ แต่ประสิทธิภาพแน่นอนมีส่วนเกี่ยวข้องกับมัน

โฟลตของจริงและดับเบิลนั้นค่อนข้างเลื่องลือเพราะประเภทนั้นขึ้นอยู่กับความแม่นยำที่คุณต้องการ

ไม่ได้จริงๆ วิธีการ "ทุกอย่างมีความแม่นยำสองเท่า" เป็นเรื่องปกติ


1
บางทีประเภทฐานควรประกาศเจตนาพื้นฐานของประเภทเช่น int สำหรับตัวเลข "ธรรมดา" สองเท่าสำหรับ "ทศนิยม" ปกติทั้งหมด (ไม่ควร ints สามารถมีทศนิยมแม้ว่าเพื่อความเรียบง่าย?) "เงิน" สำหรับการทำงานกับจำนวนและไบต์ สำหรับการทำงานกับข้อมูลไบนารี ข้อ จำกัด ประเภทที่ประกาศผ่านแอททริบิวต์อาจอนุญาตให้ประกาศช่วงที่อนุญาตความแม่นยำทศนิยมความสามารถในการเปลี่ยนค่าได้และแม้แต่ค่าที่อนุญาต มันจะเจ๋งถ้าคุณสามารถสร้างประเภทที่กำหนดเองและนำกลับมาใช้ใหม่ได้
Homde

@ Konrad: IMHO เหตุผลจำนวนเต็ม "ไม่ได้ลงนาม" ทำให้เกิดอาการปวดหัวใน C คือบางครั้งพวกเขาจะใช้เพื่อแสดงตัวเลขและบางครั้งใช้เพื่อเป็นตัวแทนสมาชิกของแหวนพีชคณิตนามธรรมล้อมรอบ การแยกประเภท "ริง" และ "หมายเลขที่ไม่ได้ลงชื่อ" สามารถทำให้มั่นใจได้ว่าโค้ดเช่นunum64 += ring32a-ring32bนั้นจะให้ผลการทำงานที่ถูกต้องเสมอโดยไม่คำนึงว่าประเภทจำนวนเต็มเริ่มต้นคือ 16 บิตหรือ 64 [โปรดทราบว่าการใช้+=เป็นสิ่งจำเป็น การแสดงออกเช่นunum64a = unum64b + (ring32a-ring32b);นั้นควรถูกปฏิเสธว่าคลุมเครือ]
supercat

0

ฉันเข้าใจถึงเหตุผลตัวแปร / วัตถุถูกเก็บไว้ในหน่วยความจำจำเป็นต้องจัดสรรหน่วยความจำและดังนั้นเราจึงจำเป็นต้องรู้ว่าตัวแปรมีขนาดใหญ่ได้อย่างไร แต่จริงๆแล้วภาษาการเขียนโปรแกรมสมัยใหม่ไม่ควรที่จะจัดการกับ "ชนิดปรับตัว" เช่นถ้าบางสิ่งบางอย่างที่เคยจัดสรรในช่วง shortint จะใช้ไบต์น้อยลงและหากมีการจัดสรรบางสิ่งบางอย่างในจำนวนที่มากหน่วยความจำจะถูกจัดสรร สำหรับตัวอย่างนั้น

โฟลตของจริงและดับเบิลนั้นค่อนข้างเลื่องลือเพราะประเภทนั้นขึ้นอยู่กับความแม่นยำที่คุณต้องการ สตริงควรจะสามารถใช้หน่วยความจำน้อย upp ในหลาย ๆ กรณี (ใน. Net) ที่ส่วนใหญ่ ascii ใช้สตริง buth ใช้หน่วยความจำสองเท่าเพราะการเข้ารหัสแบบ unicode

Fortran มีบางอย่างที่คล้ายกัน (ฉันไม่รู้ว่านี่คือสิ่งที่คุณหมายถึงอย่างแท้จริงเพราะฉันเห็นสองคำถามขึ้นจริง ๆ ) ตัวอย่างเช่นใน F90 ขึ้นไปคุณไม่จำเป็นต้องกำหนดขนาดประเภทอย่างชัดเจนเพื่อที่จะพูด ซึ่งเป็นสิ่งที่ดีไม่เพียง แต่จะช่วยให้คุณเป็นศูนย์กลางในการกำหนดประเภทข้อมูลของคุณ แต่ยังเป็นวิธีการกำหนดแบบพกพา REAL * 4 ไม่เหมือนกันในทุกการใช้งานของโปรเซสเซอร์ทั้งหมด (และโดยโปรเซสเซอร์ฉันหมายถึง CPU + คอมไพเลอร์) ไม่ใช่โดย Longshot

select_real_kind (p, r)ส่งคืนค่าชนิดของข้อมูลจริงที่มีความแม่นยำทศนิยมมากกว่าหลักอย่างน้อย p หลักและช่วงเลขชี้กำลังสูงกว่าอย่างน้อย r

ตัวอย่างเช่นคุณไป

program real_kinds
integer,parameter :: p6 = selected_real_kind(6)
integer,parameter :: p10r100 = selected_real_kind(10,100) !p is precision, r is range
integer,parameter :: r400 = selected_real_kind(r=400)
real(kind=p6) :: x
real(kind=p10r100) :: y
real(kind=r400) :: z

print *, precision(x), range(x)
print *, precision(y), range(y)
print *, precision(z), range(z)
end program real_kinds

(ฉันคิดว่ามันเป็นตัวอย่างที่อธิบายได้ด้วยตนเอง)

ยังไม่รู้ว่าฉันเข้าใจคำถามของคุณถูกต้องหรือไม่และนี่คือสิ่งที่คุณพูดถึง

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