gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:07:44 25 4
gpt4 key购买 nike

程序

我使用 Eclipse 编写、编译、构建和运行这段代码。在 Windows 和 Linux 上均适用。

Card.h

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

卡片.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 Internal Builder 构建时在 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 Internal Builder:

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 中?

最佳答案

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

关于c++ - `sizeof()` 在 Windows 和 Linux 上返回不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35373284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com