मैंने अभी Bug in VC++ 14.0 (2015) compiler? से सीखा है कि किसी को यह नहीं समझना चाहिए कि स्ट्रक्चर का लेआउट स्मृति में कैसे समाप्त होगा। हालांकि, मुझे समझ में नहीं आता कि मैंने कितने कोड में देखा है।कोई सी ++ स्ट्रक्चर लेआउट के बारे में धारणा कैसे नहीं बना सकता है?
uboVS.model = ...
uboVS....
तो बस struct से अधिक प्रतियां (मेजबान स्मृति में) करने के लिए:
एक struct
struct {
glm::mat4 projection;
glm::mat4 model;
glm::vec4 lightPos;
} uboVS;
तो अपने खेतों भरता को परिभाषित करता है: उदाहरण के लिए, Vulkan ग्राफिक्स एपीआई निम्नलिखित करता है memcpy के माध्यम से डिवाइस मेमोरी:
uint8_t *pData;
vkMapMemory(device, memory, 0, sizeof(uboVS), 0, (void **)&pData);
memcpy(pData, &uboVS, sizeof(uboVS));
vkUnmapMemory(device, memory);
फिर GPU पर, यह उस यूआरबी को उस stru से मेल खाने के लिए परिभाषित करता है सीटी:
layout (binding = 0) uniform UBO
{
mat4 projection;
mat4 model;
vec4 lightPos;
} ubo;
फिर, जीपीयू पक्ष पर, यूबो हमेशा यूबोवीएस से मेल खाता है।
क्या यह वही अपरिभाषित व्यवहार है? क्या वह कोड यूबीओवीएस संरचना पर निर्भर नहीं है, जैसा कि परिभाषित किया गया है, या दोनों तरफ (संकलित सी ++ कोड और संकलित एसपीआईआर-वी शेडर) मूल रूप से एक ही अलग संरचना लेआउट उत्पन्न करने के लिए? (https://www.securecoding.cert.org/confluence/display/c/EXP11-C.+Do+not+make+assumptions+regarding+the+layout+of+structures+with+bit-fields में पहले उदाहरण के समान)
यह प्रश्न वल्कन या ग्राफिक्स एपीआई के लिए विशिष्ट नहीं है, मैं उत्सुक हूं कि वास्तव में क्या लगता है और स्मृति के एक हिस्से के रूप में संरचना का उपयोग करना ठीक है। मैं संरचना पैकिंग और संरेखण को समझता हूं, लेकिन इसके लिए और भी कुछ है?
धन्यवाद
किसी को संकलन डोमेन में कभी भी संरचना का उपयोग नहीं करना चाहिए। यह कभी-कभी थोड़ी देर के लिए काम कर सकता है, लेकिन इसे आदत के रूप में कर रहा है, आप उस कोड के बहुत से रख-रखाव को पूरा कर सकते हैं, जब अन्य समाधान एक बार लिखा जा सकता था और नियमित रखरखाव की आवश्यकता नहीं होती थी। यदि आपकी योजना नौकरी सुरक्षा के लिए ऐसा करना है, तो सुनिश्चित करें कि आप इसे आजमा सकते हैं और देख सकते हैं कि यह आपके लिए कितना अच्छा काम करता है। –
आप [इस प्रश्न और उत्तर] को देखना चाह सकते हैं। (Http://stackoverflow.com/questions/38428666/why-can-glbufferdata-buffer-structs-for-ubo-and-ssbo-when-c-does -नॉट-निर्दिष्ट-एस/38429253 # 38429253) –
संरचना लेआउट के बारे में धारणाओं से बचने के लिए, structs पर 'memcpy' का उपयोग न करें (अन्य चीजों के साथ) –