อาการ
พิจารณาสถานการณ์สมมติต่อไปนี้
-
คุณสร้างโปรแกรมประยุกต์ที่โหลดไบต์ จากโครงสร้าง หรือ จากคลาใน Microsoft Visual Studio 2008 Service Pack 1 (SP1)
-
คุณเปิดตัวเลือกการปรับให้เหมาะสม/Oxหรือตัวเลือกการปรับให้เหมาะสม/O2
-
คุณคอมไพล์แอพลิเคชัน โดยใช้การตั้งค่าคอนฟิกที่นำออกใช้สำหรับ x64 แพลตฟอร์ม
ในสถานการณ์สมมตินี้ ออฟเซ็ตที่จะถูกสร้างขึ้นในการเข้าถึงสมาชิกโครงสร้างหรือเป็นสมาชิกของคลาส ไม่ถูกต้อง
ปัญหานี้เกิดขึ้นเฉพาะ เมื่อขนาดโครงสร้าง และออฟเซ็ต หรือขนาดคลาส และออฟเซ็ตเท่ากับหนึ่งในคู่ต่อไปนี้:-
(14,13)
-
(15,13)
-
(22,21)
-
(23,21)
-
(30,29)
-
(31,29)
การแก้ปัญหา
ข้อมูลโปรแกรมแก้ไขด่วน
โปรแกรมแก้ไขด่วนจะพร้อมใช้งานได้ในขณะนี้จาก Microsoft อย่างไรก็ตาม มุ่งหวังเพื่อแก้ไขปัญหาที่อธิบายไว้ในบทความนี้เท่านั้น นำวิธีนี้ไปใช้กับระบบที่ประสบกับปัญหาที่เฉพาะเจาะจงเท่านั้น โปรแกรมแก้ไขด่วนนี้อาจได้รับการทดสอบเพิ่มเติม ดังนั้น ถ้าคุณจะไม่รุนแรงได้รับผลกระทบจากปัญหานี้ เราขอแนะนำให้ คุณรอถัดไป Visual Studio 2008 service pack ที่ประกอบด้วยโปรแกรมแก้ไขด่วนนี้
เมื่อต้องการแก้ไขปัญหานี้ทันที ติดต่อฝ่ายบริการสนับสนุนลูกค้าของ Microsoft เพื่อขอรับโปรแกรมแก้ไขด่วน สำหรับรายการทั้งหมดของหมายเลขโทรศัพท์บริการการสนับสนุนลูกค้าของ Microsoft และข้อมูลเกี่ยวกับค่าใช้จ่ายในการสนับสนุน โปรดเยี่ยมชมเว็บไซต์ต่อไปนี้ของ Microsoft:http://support.microsoft.com/contactus/?ws=supportหมายเหตุ ในกรณีพิเศษ ค่าบริการที่เรียกเก็บตามปกติเมื่อโทรติดต่อฝ่ายสนับสนุนอาจจะยกเลิกได้หาก Microsoft Support Professional ตัดสินว่าโปรแกรมปรับปรุงที่เฉพาะเจาะจงจะแก้ไขปัญหาของคุณได้ ค่าใช้จ่ายในการสนับสนุนตามปกติจะใช้กับคำถามและปัญหาในการสนับสนุนเพิ่มเติมซึ่งไม่สอดคล้องตามเกณฑ์สำหรับโปรแกรมปรับปรุงเฉพาะที่เกี่ยวข้อง
ข้อกำหนดเบื้องต้น
คุณต้องมี Visual Studio 2008 Service Pack 1 ติดตั้งอยู่เพื่อใช้โปรแกรมแก้ไขด่วนนี้
ข้อกำหนดการรีสตาร์ท
คุณไม่ต้องรีสตาร์ทคอมพิวเตอร์หลังจากใช้โปรแกรมแก้ไขด่วนนี้
ข้อมูลการแทนที่โปรแกรมแก้ไขด่วน
โปรแกรมแก้ไขด่วนนี้ไม่ได้แทนโปรแกรมแก้ไขด่วนอื่น ๆ
ข้อมูลแฟ้ม
เวอร์ชันภาษาอังกฤษของโปรแกรมแก้ไขด่วนนี้มีแอตทริบิวต์ของแฟ้ม (หรือแอตทริบิวต์ของแฟ้มที่ใหม่กว่านี้) ซึ่งแสดงรายการไว้ในตารางต่อไปนี้ วันที่และเวลาสำหรับแฟ้มเหล่านี้จะแสดงรายการไว้ในรูปแบบเวลามาตรฐานสากล (UTC) เมื่อคุณดูข้อมูลแฟ้ม ระบบจะแปลงข้อมูลนี้เป็นเวลาท้องถิ่น เมื่อต้องการค้นหาความแตกต่างระหว่างเวลา UTC กับเวลาท้องถิ่น ใช้แท็บ โซนเวลา ในรายการ วันที่และเวลา ในแผงควบคุม
ชื่อแฟ้ม |
รุ่นของแฟ้ม |
ขนาดของแฟ้ม |
วันที่ |
เวลา |
แพลตฟอร์ม |
---|---|---|---|---|---|
C2.dll |
15.0.30729 4082 |
2,283,320 |
19 2009 มีนาคม |
05:13 |
x86 |
C2.dll |
15.0.30729.4082 |
2,36 1,656 |
19 2009 มีนาคม |
05:13 |
x86 |
C2.dll |
15.0.30729.4082 |
3,01 7,528 |
19 2009 มีนาคม |
05:13 |
x64 |
Link.exe |
9.0.30729.4082 |
1,0 54,520 |
19 2009 มีนาคม |
05:13 |
x64 |
Link.exe |
9.0.30729.4082 |
799, 032 |
19-Mar-2009 |
05:13 |
x86 |
วิธีแก้ปัญหา
เมื่อต้องการหลีกเลี่ยงปัญหานี้ เพิ่มอย่าง น้อยหนึ่งสมาชิกดัม "อักขระไม่มีลายเซ็น" เมื่อต้องการขยายขนาด ของโครงสร้าง หรือ ของคลาสที่เป็นผลคูณน้อยที่สุด 8 ไบต์ ตัวอย่างเช่น ขยาย 14 ไบต์ 16 ไบต์
สถานะ
Microsoft ยืนยันว่านี่เป็นปัญหาในผลิตภัณฑ์ของ Microsoft ซึ่งแสดงไว้ในส่วน "นำไปใช้กับ"
ข้อมูลเพิ่มเติม
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับศัพท์เฉพาะในการปรับปรุงซอฟต์แวร์ ให้คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:
824684คำอธิบายของคำศัพท์มาตรฐานที่ใช้เพื่ออธิบายปรับปรุงซอฟต์แวร์ของ Microsoft
ขั้นตอนในการทบทวนเกิดปัญหา
-
สร้างโปรแกรมประยุกต์ที่มีชื่อว่า Test.cpp โดยใช้รหัสต่อไปนี้ใน Visual Studio 2008 SP1:
typedef struct DskDecimal
{ unsigned char precision; unsigned char scaleFactor; unsigned short value[ 5]; unsigned char maxPrecision; unsigned char maxScaleFactor; } DskDecimal; int main() { DskDecimal decimal; decimal.maxScaleFactor = 4; DskDecimal self = decimal; return self.maxScaleFactor; } -
คอมไพล์แอพลิเคชัน โดยใช้คำสั่งต่อไปนี้:
ล้ test.cpp /O2 /MD
ผลลัพธ์คาดไว้คือ 4 อย่างไรก็ตาม ผลที่เกิดขึ้นจริงเป็น 0