متى يمكن typeid العودة حالات type_info مختلفة لنفس النوع؟
-
10-07-2019 - |
سؤال
اندريه ألكساندريسكو يكتب في <لأ href = "http://books.google.com/books؟id= aJ1av7UFBPwC وخريج = PA38 وDQ = typeid + type_info + عمر # ت = onepage وف = typeid٪ 20type_info٪ 20lifetime وو = كاذبة "يختلط =" noreferrer "> تصميم ++ C الحديثة :
<اقتباس فقرة> والكائنات التي يتم إرجاعها بواسطة typeid
لها
تخزين ثابت، لذلك لم يكن لديك ل
قلق حول قضايا الحياة.
واندريه قائلا:
<اقتباس فقرة> وهذا المعيار لا يضمن أن
كل استدعاء، ويقول، typeid(int)
إرجاع إشارة إلى نفسه
الكائن type_info
.
وعلى الرغم من أن المعيار لا يضمن هذا، وكيف يتم هذا تنفيذها في المجمعين المشتركة، مثل دول مجلس التعاون الخليجي و Visual Studio؟
وعلى افتراض typeid
لا تسرب (والعودة مثيل جديد كل مكالمة)، هل هو واحد "الجدول" في التطبيق، لكل وحدة الترجمة، في دلل / نحو ذلك، أو شيء مختلف تماما؟
هل هناك أوقات عندما &typeid(T) != &typeid(T)
؟
وأنا مهتم بشكل رئيسي في المجمعين ويندوز، ولكن هو موضع تقدير أي معلومات لينكس ومنصات أخرى أيضا.
المحلول
هل هناك أوقات عندما وtypeid (T)! = & typeid (T)؟
وأنا مهتم بشكل رئيسي في المجمعين ويندوز، ولكن هو موضع تقدير أي معلومات لينكس ومنصات أخرى أيضا.
اقتباس فقرة>نعم. تحت النوافذ DLL لا يمكن أن يكون حرف التي لم تحل بعد، وبالتالي. إذا كان لديك:
وfoo.h
struct foo { virtual ~foo() {} };
وdll.cpp
#include "foo.h"
...
foo f;
cout << &typeid(&f) << endl
وMAIN.CPP
#include "foo.h"
...
foo f;
cout << &typeid(&f) << endl
هل تعطيك مؤشرات مختلفة. لأنه قبل دلل تم تحميل typeid (فو) يجب أن تكون موجودة في كل من إكس DLL والأساسي
وأكثر بعد ذلك، لينكس، إذا لم يكن الملف التنفيذي المترجمة الرئيسي مع -rdynamic (أو --export ديناميكية) ثم typeid ستحل على رموز مختلفة في تنفيذ و في وجوه المشتركة (والتي عادة لا يحدث تحت منصات ELF) بسبب بعض التحسينات القيام به عندما ربط تنفيذ - إزالة الرموز غير الضرورية
نصائح أخرى
ومعايير ترك أحيانا سلوك معين غير محدد من أجل إعطاء تطبيقات بعض الحرية. في هذه الحالة، كيف تدار TypeIDs يتم ترك متابعة تنفيذ مترجم وكنت مجرد الحصول على مجموعة من القواعد (أساسا: لا تشغل نفسك مع الكيفية التي يتم بها تخصيص الذاكرة لهذا)
.هل هناك أي سبب معين لماذا عليك أن تكون قادرا على مقارنة TypeIds استنادا إلى عنوان ذاكرتهم؟ TypeIds تجاوز بالفعل == و! = من أجل توفير لكم مع القدرة على المقارنة بينها، وتوفير اسم () التي يمكن أن تستخدم لتحديد وضعهم بشكل فريد.
إذا كنت قد حصلت على C ++ لغة برمجة (بيارن ستروستروب) متوفرة، الفصل 15 لديه الكثير من التفاصيل حول معالجة الهرمية الطبقة. ربما قد تجد حل آخر هناك؟