我正在尝试C++20 中引入的[[no_unique_address]]属性。据我从cppreference 文章和dcl.attr.nouniqueaddr标准章节中了解到,此属性表明该字段不需要具有与该类的所有其他非静态数据成员不同的地址。因此编译器可以优化结构体的内存布局。但有一件事让我感到困惑。
考虑以下示例(https://godbolt.org/z/fj6nGebcs):
struct Empty {};
struct Test {
[[no_unique_address]] Empty em1;
char f1;
int f2;
[[no_unique_address]] Empty em2;
};
Run Code Online (Sandbox Code Playgroud)
该字段em1的大小为零,并将位于与 相同的地址f1。对我来说,似乎合乎逻辑的是,可以应用相同的优化em2,并且它将具有相同的地址和f2零大小。但事实并非如此。经过一些实验,我可以说,如果[[no_unique_address]]在结构体末尾定义了一个字段,则这种优化根本不起作用。因此,使用最新版本的 gcc 和 clang 进行编译时, 的大小struct Test将为 12(1 字节char字段、3 字节对齐、4 字节int字段以及struct Empty大小为 1 字节和 3 字节对齐的字段)。
现在让我们em2向上移动(https://godbolt.org/z/Goz9Tj66K):
struct Empty {};
struct Test {
[[no_unique_address]] Empty em1;
char f1; …Run Code Online (Sandbox Code Playgroud) 我已经尝试让 docker 文件运行三天了,但始终无法安装 pandas。
在这里你可以看到我的 Dockerfile:
# pull official base image
FROM python:3.6.5-alpine
# set work directory
WORKDIR /usr/src/app
# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
RUN apk update
RUN apk add postgresql-dev cargo gcc python3-dev libffi-dev musl-dev zlib-dev jpeg-dev #--(5.2)
COPY . /usr/src/app/
# install dependencies
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)
我的requirement.txt是:
wheel==0.36.2
asgiref==3.2.10
backcall==0.2.0
beautifulsoup4==4.9.1
certifi==2020.6.20
chardet==3.0.4
colorama==0.4.3
Cython==0.29.22
decorator==4.4.2
defusedxml==0.6.0
Django==3.1.6
django-allauth==0.42.0
django-crispy-forms==1.9.2
django-extensions==3.0.9
django-markdownx==3.0.1
et-xmlfile==1.0.1
gunicorn==20.0.4
idna==2.10
importlib-metadata==2.0.0 …Run Code Online (Sandbox Code Playgroud)