Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > padding struct to align


Автор: Alca 24.6.2011, 12:35
Ubuntu, g++ 4.5.2

Код

class CUrl {
    public:
        std::string  m_sScheme;
        std::string  m_sUser;
        std::string  m_sPass;
        std::string  m_sHost;
        USHORT     m_usPort;
        std::string  m_sPath; //<<< warning: padding struct to align ‘CUrl::m_sPath’
        std::string  m_sQuery;
        std::string  m_sFragment;

                     CUrl();
        virtual ~CUrl();
    //...
};

CUrl::CUrl() :
    m_sScheme  (),
    m_sUser    (),
    m_sPass    (),
    m_sHost    (),
    m_usPort   (0),
    m_sPath    (),   
    m_sQuery   (),
    m_sFragment()
{
}

CUrl::~CUrl() {
}

Как пофиксить этот ворнинг?

Добавлено @ 12:36
кажись я чего-то не знаю про выравнивание данных в классе (структуре).

Автор: azesmcar 24.6.2011, 12:50
Alca

Убери флаг -Wpadded из командной строки. Компилятор просто предупреждает, что данные будут выровнены.

Автор: Alca 24.6.2011, 13:11
Цитата

Убери флаг -Wpadded из командной строки.

Так я его спецом  втыкнул, 

Цитата

Компилятор просто предупреждает, что данные будут выровнены.

Это как-то будет влиять скорость или объем занимаемой памяти

Автор: azesmcar 24.6.2011, 13:15
Цитата(Alca @  24.6.2011,  13:11 Найти цитируемый пост)
Это как-то будет влиять скорость или объем занимаемой памяти 

возможно, 
Цитата(Alca @  24.6.2011,  13:11 Найти цитируемый пост)
Так я его спецом  втыкнул, 

Ну тогда просто пропусти предупреждение, в данном случае я не вижу как ты от него избавишься.
Если у тебя к примеру есть структура
Код

struct X
{
    short x;
    int y;
    short z;
};

то можно избавиться от выравнивания поменяв местами y и z, но в твоем случае я решения не вижу.

Цитата(Alca @  24.6.2011,  13:11 Найти цитируемый пост)
Это как-то будет влиять скорость или объем занимаемой памяти 

почему тебя это заботит?

Автор: Alca 24.6.2011, 13:18
Цитата

почему тебя это заботит?

Особо не парюсь по поводу производительности, просто хочу знать суть проблемы.
Спасибо.

Добавлено через 30 секунд
Вообще это CGI скрипт

Автор: borisbn 24.6.2011, 13:49
Цитата(azesmcar @  24.6.2011,  13:15 Найти цитируемый пост)
можно избавиться от выравнивания поменяв местами y и z, но в твоем случае я решения не вижу

а здесь нельзя перекинуть m_usPort в конец ?

Автор: azesmcar 24.6.2011, 14:49
Цитата(borisbn @  24.6.2011,  13:49 Найти цитируемый пост)
а здесь нельзя перекинуть m_usPort в конец ? 

можно, но что это даст? компилятору все равно придется выронить структуру, так-как рамзер short-а - 2 байта, а выравнивание скорее всего идет на 4 или 8 байт.

Автор: Alca 24.6.2011, 15:04
Цитата

а здесь нельзя перекинуть m_usPort в конец ?

перекидывал - тоже самое

Автор: Earnest 24.6.2011, 15:06
1. сделать usPort размером в 4 байта (если можно)
2. просто отключить локально ворнинг, чтобы глаза не мозолил

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)