`sizeof()`在Windows和Linux上返回不同的值

时间:2016-02-12 22:27:02

标签: c++ linux eclipse windows

程序

我使用Eclipse编写,编译,构建和运行此代码。在Windows和Linux上都有。

Card.h

class Card {
private:
    static int  _palette[][3];
public:
    static int  (*palette())[3];
};

Card.cpp

#include "Card.h"

int Card::_palette[][3]=    {
    {168, 0,   32},
    {228, 92,  16},
    {248, 216, 120},
    {88,  216, 84},
    {0,   120, 248},
    {104, 68,  252},
    {216, 0,   204},
    {248, 120, 248}
};

main.cpp

#include <iostream>
#include "Card.h"

int main(int argc, char **argv) {
    int uniqueColors=   sizeof(Card::palette());
    std::cout << uniqueColors << std::endl;
    return 0;
}

这将在我的Windows10操作系统上打印4,在Debian 8.2 Jessie上打印8

Windows构建日志

当我使用MinGW GCC工具链和CDT内部构建器构建时,这是64位Win10上的Eclipse控制台:

16:53:09 **** Rebuild of configuration Debug for project sizeOf-test ****
Info: Internal Builder is used for build
g++ -O0 -g3 -Wall -c -fmessage-length=0 -o Card.o "..\\Card.cpp" 
g++ -O0 -g3 -Wall -c -fmessage-length=0 -o main.o "..\\main.cpp" 
g++ -o sizeOf-test.exe Card.o main.o -lmingw32 

16:53:11 Build Finished (took 1s.934ms)

当我运行该程序时,它会打印4

Linux构建日志

这是64位Debian 8.2 Jessie上的Eclipse控制台,使用Linux GCC工具链和CDT内部构建器:

17:17:57 **** Incremental Build of configuration Debug for project cpp-sizeof-test ****
Info: Internal Builder is used for build
g++ -O0 -g3 -Wall -c -fmessage-length=0 -o main.o ../main.cpp 
g++ -O0 -g3 -Wall -c -fmessage-length=0 -o Card.o ../Card.cpp 
g++ -o cpp-sizeof-test Card.o main.o 

17:17:57 Build Finished (took 327ms)

问题

  1. 为什么会有区别?
  2. 如何更改代码,以便在每个操作系统上打印成员变量_palette中正确数量的数组?
  3. 可选:如果没有多维数组,是否有更简洁的方法来实现我的目标?在C ++ 98或C ++ 11中?

1 个答案:

答案 0 :(得分:3)

你的函数palette返回一个指针; sizeof告诉你sizeof系统上的指针。显然,Linux和Windows机器上的sizeof指针是不同的,这就是为什么你会得到不同的结果。 sizeof无法跟踪附加到指针的内存量,您必须手动跟踪它。