Nano Hash - криптовалюты, майнинг, программирование

размер этой структуры не складывается

Возможный дубликат:
Почему sizeof для структуры не равен сумме sizeof каждого члена?
sizeof(struct) возвращает неожиданное значение

Я написал программу для определения размера следующей структуры abc.

а. Встроенный оператор sizeof() упоминает, что размер этой структуры равен 40, хотя на самом деле он равен 32? Также я попытался вычесть адреса, чтобы определить это, и это также дало 40.

б. Когда я закомментирую "char g[3];" внутри структуры abc размер abc = 32. Это также не имеет для меня никакого смысла. Разве это не должно быть 28?

в. Зачем мне нужно приведение к «unsigned int»? Если я не выполняю приведение, я получаю следующее сообщение об ошибке компиляции. Разве &a[0] на самом деле не адрес (который должен быть целым числом)?

size_of_struct\size_of_struct.cpp(24): ошибка C2440: '=': невозможно преобразовать из 'abc *' в 'unsigned int'

Информация: У меня Win 7, 64-битная система. Компилятор MS Visual Studio.

#include <iostream>

struct char_three{
    char a[3];
};

struct int_three{
    int a[3];
};

struct abc 
{
    int a; // 4 bytes
    double b; // 8
    void *ptr; // 4
    char g[3]; // 4 due to padding ?
    int c[3]; // 12
}; // Total size of struct - 31 / 32.

int main () 
{
    abc a[2]; 
    unsigned int add0, add1;
    add0 = (unsigned int) &a[0];
    add1 = (unsigned int) &a[1];
    printf("add1 of a is :%x add0 is :%x\n", add1, add0);

    printf("size of struct abc : %d\n", add1-add0);
    printf("size of int: %d\n", sizeof(int));
    printf("size of double: %d\n", sizeof(double));
    printf("size of void ptr: %d\n", sizeof(void *));
    printf("size of 3 char: %d\n", sizeof(char_three));
    printf("size of 3 int: %d\n", sizeof(int_three));
    printf("size of a: %d\n", sizeof(a));
    system("pause");
    return 0;
}

O/P:
add1 of a is :51f828 add0 is :51f800
size of struct abc : 40
size of int: 4
size of double: 8
size of void ptr: 4
size of 3 char: 3
size of 3 int: 12
size of a: 80
Press any key to continue . . .
18.09.2012

  • Подробнее о заполнении читайте здесь. 18.09.2012
  • Вы можете выполнить арифметические действия с указателями по адресам различных переменных-членов, чтобы увидеть, где компилятор добавил заполнение. 18.09.2012
  • К вашему сведению, в компиляторах MS #pragma warning(default:4820) активирует предупреждение, указывающее, где заполнение добавляется в середине структуры, но заполнение также добавляется в конец структуры, поэтому массивы структуры будут поддерживать выровненный доступ. В этом случае 4 байта были добавлены в конец, чтобы сделать общий размер 40, поэтому двойник всегда будет выравниваться по 8 байтам в массивах этой структуры. 18.09.2012

Ответы:


1

Вы не должны явно полагаться на sizeof() структур. Реализация определяет, вводит ли компилятор отступы, и если да, то где. Если вы используете компилятор, совместимый с GCC, и не возражаете против других наборов инструментов (подождите, есть ли другие наборы инструментов?), вы можете использовать __attribute__((packed)), чтобы указать компилятору вообще не добавлять отступы в вашу структуру.

18.09.2012
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..