আমি জানি এটি একটি দুর্দান্ত সাধারণ বিষয়, তবে সাধারণ ইউবি যতটা খুঁজে পাওয়া সহজ, আমি এখনও এই রূপটি খুঁজে পাইনি।
সুতরাং, আমি তথ্যের অনুলিপি এড়িয়ে গিয়ে পিক্সেল অবজেক্টগুলিকে আনুষ্ঠানিকভাবে পরিচয় করানোর চেষ্টা করছি।
এটা কি বৈধ?
struct Pixel {
uint8_t red;
uint8_t green;
uint8_t blue;
uint8_t alpha;
};
static_assert(std::is_trivial_v<Pixel>);
Pixel* promote(std::byte* data, std::size_t count)
{
Pixel * const result = reinterpret_cast<Pixel*>(data);
while (count-- > 0) {
new (data) Pixel{
std::to_integer<uint8_t>(data[0]),
std::to_integer<uint8_t>(data[1]),
std::to_integer<uint8_t>(data[2]),
std::to_integer<uint8_t>(data[3])
};
data += sizeof(Pixel);
}
return result; // throw in a std::launder? I believe it is not mandatory here.
}
প্রত্যাশিত ব্যবহারের প্যাটার্ন, খুব সহজসাধ্য:
std::byte * buffer = getSomeImageData();
auto pixels = promote(buffer, 800*600);
// manipulate pixel data
আরো নির্দিষ্টভাবে:
- এই কোডটি কি সঠিকভাবে সংজ্ঞায়িত আচরণ করে?
- যদি হ্যাঁ, এটি কি ফিরে আসা পয়েন্টারটি ব্যবহার করা নিরাপদ করে?
- যদি হ্যাঁ, অন্য কোন
Pixel
ধরণের ক্ষেত্রে এটি বাড়ানো যেতে পারে? (কেবলমাত্র 3 টি উপাদানযুক্ত পিক্সেলটি কী_ট্রিভিয়াল সীমাবদ্ধতা শিথিল করা হচ্ছে?)
ঝনঝন এবং জিসিসি উভয়ই পুরো লুপটিকে নির্লজ্জের জন্য অনুকূলিত করে, যা আমি চাই। এখন, আমি এটি জানতে চাই যে এটি কিছু সি ++ বিধি লঙ্ঘন করে কিনা।
আপনি যদি এটির সাথে চারপাশে খেলতে চান তবে গডবোল্ট লিঙ্ক ।
(দ্রষ্টব্য: সত্ত্বেও আমি সি ++ 17 ট্যাগ করিনি std::byte
, কারণ প্রশ্নটি ব্যবহার করে রাখে char
)
pixels[some_index]
বা করেন *(pixels + something)
? তা হবে ইউবি।
pixels
(পি) অ্যারে অবজেক্টের জন্য পয়েন্টার নয়, তবে একটি একক পয়েন্টার Pixel
। এর অর্থ আপনি কেবল pixels[0]
আইনীভাবে অ্যাক্সেস করতে পারবেন ।
Pixel
এস নতুন রাখা এখনওPixel
এস এর অ্যারে নয় not