Проблема заключается в том, что все стандартные визугалисты, которые я использую, не могут правильно отобразить мой контейнер из -за его нетрадиционной компоновки памяти. Итераторы моего контейнера, поиск элементов и управление памятью настолько нестандартны, что отладчики просто не могут проанализировать свою внутреннюю структуру.
Эта визуализация такова, что вы можете понять, как внутренние работы без необходимости читать большую часть деталей реализации. < /p>
макет памяти < /h6>
block < /h6>
Код: Выделить всё
+--------------------------------+
| int[] | float[] | char[] |
+--------------------------------+
^ ^ ^
| offset 1 |
| |
| offset 2
base
< /code>
logical < /h6>
[int1][float1][char1]
[int2][float2][char2]
[int3][float3][char3]
std::tuple arrays = {}; /* single allocation */
void init_arrays(const char *data)
{
size_t offset = 0;
([&](std::index_sequence)
{
((std::get(arrays) = reinterpret_cast(
const_cast(data) + offset), /* single memory blob*/
offset += cap * sizeof(...)), ...);
})(std::make_index_sequence {});
}
/* at a given index, reconstruct tuple elements */
value_type get_element(size_type index) const noexcept
{
return std::apply([&](auto *... ptrs)
{
return std::make_tuple(ptrs[index]...);
}, arrays);
}
< /code>
воспроизведения < /h4>
просто скопируйте фрагмент вместе с реализацией контейнера и осмотрите таким образом, что позволяет вам видеть визуализацию отладки в соответствии с вашей собственной IDE. < /P>
также отметьте, что контейнер удовлетворяет требованиям C ++ STL < /p>
#include
int main()
{
StrideArray strd_arr = {};
strd_arr.push_back(0, 3.14, 'a'); /* [0]: 0, [1]: 3.14, [2]: 'a' */
strd_arr.get(0); /* get index 0 of array 1 */
strd_arr.size(); /* size */
strd_arr.capacity(); /* capacity */
/* please refer to the implementation for API reference */
return 0;
}
< /code>
Я прочитал несколько постов и статей о симпатичных принтерах LLDB и методах расширения отладчиков, а также о старых сообщениях Stackoverflow, но для Clion, в частности, почти нет воспроизводимой документации. Я также попытался создать основные симпатичные принтеры на основе Python, похожие на подходы GDB, но они не отображались достаточно хорошо для среды Клиона. Визуализатор отладки, который может проанализировать этот вид макета памяти и правильно отображать размер, емкость и элементы контейнера, а также обрабатывать гетерогенную природу контейнера. Стоит также знать, что реализация использует расширение пакета параметров шаблона, создание динамического массива на основе кортежей и поиск пользовательских элементов. читается во время отладки, предпочтительно с решением, которое работает непосредственно в интерфейсе Клиона. Параллельные массивы разных типов с минимальными накладными расходами на память, как аст. "
Подробнее здесь: https://stackoverflow.com/questions/794 ... -container