मैं कुछ प्रकार T
के मेमोरी संरेखण के लिए जांच करना चाहता हूं। यह करने के लिए सरल तरीकेuintptr_t पोर्टेबल विकल्प
if (((uintptr_t)&var & __alignof(T) - 1) == 0) ...
तथापि है, uintptr_t
मौजूदा सी का हिस्सा ++ मानक नहीं है और यह कुछ compilers द्वारा समर्थित नहीं है, तो मैं यह करने के लिए एक पोर्टेबल वैकल्पिक तरीका के लिए देख रहा हूँ और std::ptrdiff_t
अच्छा लग रहा है मेरे लिए। std::ptrdiff_t
दो पॉइंटर्स के बीच अंतर को स्टोर करने में सक्षम होने की गारंटी देता है, लेकिन कौन कहता है कि उन पॉइंटर्स में से एक शून्य सूचक नहीं हो सकता है? उस स्थिति में std::ptrdiff_t
को पॉइंटर के रूप में कम से कम एक ही आकार होना चाहिए।
template <typename T> bool is_properly_aligned(const T* const ptr)
{
std::ptrdiff_t diff = (ptr - static_cast<T*>(0)) * sizeof(T);
return ((diff & __alignof(T) - 1) == 0);
}
या ऐसा (sizeof(T)
द्वारा गुणा से छुटकारा पाने के)
template <typename T> bool is_properly_aligned(const T* const ptr)
{
std::ptrdiff_t diff =
reinterpret_cast<const char*>(ptr) - static_cast<const char*>(0);
return ((diff & __alignof(T) - 1) == 0);
}
क्या आप समाधान इस तरह के बारे में सोचते हैं? क्या यह पोर्टेबल पर्याप्त है? मुझे कोई कारण नहीं दिख रहा है कि यह क्यों विफल होना चाहिए, हालांकि मैं पुष्टि करना चाहता हूं।
धन्यवाद।
आपने लिखा 'मुझे लगता है कि ptrdiff_t वास्तव में दो बिंदुओं के बीच अंतर का प्रतिनिधित्व करने के लिए सही डेटाटाइप है। मेरा सवाल यह है कि आप क्या सोचते हैं, क्या यह ptrdiff_t में पॉइंटर पूर्णांक प्रतिनिधित्व स्टोर करने के लिए पोर्टेबल है? – ledokol
आपने लिखा 'लेकिन यह दो पॉइंटर्स की तुलना करने के लिए बहुत कम समझ में आता है अगर वे एक साधारण आवंटन से आने वाली संगत स्मृति के ब्लॉक में इंगित नहीं कर रहे हैं। मैं तुलना नहीं कर रहा हूं, मैं इसकी दूरी और उद्देश्य की गणना कर रहा हूं ताकि सूचक का पूर्णांक प्रतिनिधित्व प्राप्त हो सके। – ledokol
लेकिन ptrdiff_t int की तरह एक संख्यात्मक प्रकार नहीं है। यह int के समान आकार होने की भी गारंटी नहीं है (और 64-बिट सिस्टम पर, यह आमतौर पर नहीं है)। यदि आप इस तरह के खेल खेलना चाहते हैं, तो आप केवल कास्ट (int) पीआरटी भी डाल सकते हैं, और संरेखण के लिए निचले बिट्स की जांच कर सकते हैं। – Enno