如何进行C++对齐数组分配?

2024-03-10

我想修改数组分配:

 float * a = new float[n] ;

使用对齐的分配器。我倾向于尝试使用placement new 和 posix_memalign (或新的 c++11 等效项),但请注意数组的新放置对于数组分配来说是有问题的 https://stackoverflow.com/questions/15254/can-placement-new-for-arrays-be-used-in-a-portable-way,因为编译器可能需要额外的存储空间来存储计数或其他元数据 https://stackoverflow.com/questions/8720425/array-placement-new-requires-unspecified-overhead-in-the-buffer.

I tried:

int main()
{
   float * a = new alignas(16) float[3] ;

   a[2] = 0.0 ;

   return a[2] ;
}

但编译器似乎表明alignas被忽略:

$ g++ -std=c++11 t.cc -Werror
t.cc: In function ‘int main()’:
t.cc:4:39: error: attribute ignored [-Werror=attributes]
    float * a = new alignas(16) float[3] ;
                                       ^
t.cc:4:39: note: an attribute that appertains to a type-specifier is ignored

看起来使用alignas的正确方法是在结构体声明 使用alignas声明一个结构体 https://stackoverflow.com/a/27517755/189270,但这仅适用于固定大小。

还有一个aligned_storage模板,但我认为它也只适用于固定大小。

是否有任何标准方法来执行对齐数组分配,以调用所有元素的构造函数?


正如其他人所说,不需要支持过度对齐的类型。使用前请检查编译器文档。

您可以尝试使用以下方法之一来解决您的问题:

1)过度分配你的数组(通过(desired aligment / sizeof element) - 1)并使用标准::对齐 http://en.cppreference.com/w/cpp/memory/align。链接到libstdc++执行 https://gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/include/std/memory?view=markup#l114.

2)声明一个包含数组的结构体desired aligment / sizeof element元素并按所需对齐方式对齐。它should如果您使用此类结构的数组,则会在内存中为您提供紧凑的表示形式,但您将无法使用正常的数组表示法或指针算术(因为它(a)未定义的行为,(b)它们很可能不会被使用随意放置)

3) 编写自己的对齐分配函数。请注意,您可以添加自己的运算符版本new and delete.

namespace my
{
    struct aligned_allocator_tag {};
    aligned_allocator_tag aligned;
}

void* operator new( std::size_t count, my::aligned_allocator_tag, std::size_t aligment);
void* operator new[]( std::size_t count, my::aligned_allocator_tag, std::size_t aligment)
{
    return ::operator new(count, my::aligned, aligment);
}
//Usage
foo* c = new(my::aligned, 16) foo[20];

您将需要分配内存,保留足够的空间来存储原始指针(由 malloc/whatever 返回)或指针被移位的字节量,因此后续删除将释放正确的指针,将指针对齐到所需的大小并返回它。

Here is 一个答案 https://stackoverflow.com/a/6320500/3410396, 和另一个 https://stackoverflow.com/a/227900/3410396,它展示了如何对齐内存。

请注意,这两个答案都使用实现定义的行为,即对转换为整数的指针进行按位算术并将其转换回来。唯一真正完全标准的方法是将内存投射到char*并添加其值与下一个对齐地址之间的差值。

如果你可以使用一些非标准的内存分配函数,你可以将它们包装成自定义运算符new too.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何进行C++对齐数组分配? 的相关文章

  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 使用日期 Swift 3 对字典数组进行排序

    我有一个名为 myArray 的数组 其中添加了字典 我希望该字典按时间排序 这是字典中的键 那个时间是在 String 中 时间的日期格式为 yyyy MM dd HH mm ss 我尝试使用下面的代码解决方案 但给出了 从 字符串转换
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 在 Javascript 中连接空数组

    我正在浏览一些代码 我想知道这有什么用处 grid push concat row 根据我的理解 它等同于 grid push row 为什么要大惊小怪 连接 你想使用 concat当您需要展平数组并且没有由其他数组组成的数组时 例如 va
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 有没有办法在url中传递javascript变量?

    有没有办法让下面的脚本将 javascript 值传递到 href 链接的 url 尝试这个 win
  • Apache 的 cookie 重写规则

    我有一个有趣的问题 我需要根据 cookie 是否存在来实现重写规则 这很简单 下面的重写规则将检查 cookie 是否存在 如果存在 则不会重定向 同样 如果不存在 则会重定向 RewriteCond HTTP COOKIE 我的cook
  • maven3 - maven-antrun-plugin - “无法创建任务或键入 if”

    我正在尝试在 Maven 构建中使用 if ant 任务 我发现很多文章建议使用 ant nodeps 依赖项 最终所有这些技巧在 maven3 ant 1 8 1 maven antrun plugin 1 6 上都不起作用 发生 Ant
  • 哈希表和键顺序

    有没有办法在添加键时保持哈希表中键的顺序 就像推 弹出机制一样 Example hashtable hashtable Add Switzerland Bern hashtable Add Spain Madrid hashtable Ad
  • C++在什么情况下会将变量初始化为零? [复制]

    这个问题在这里已经有答案了 每个变量在使用之前都应该正确定义和初始化 为其赋值 然而在某些情况下 C 会将变量设置为默认值零 就像下面这个例子 class A static int val int val 10 This is the us
  • 如何使用 jQuery Deferreds 数组? [复制]

    这个问题在这里已经有答案了 我有一个应用程序 要求按特定顺序加载数据 根 URL 然后是架构 最后使用各种数据对象的架构和 url 来初始化应用程序 当用户浏览应用程序时 数据对象将被加载 根据架构进行验证并显示 当用户对数据进行 CRUD
  • python Flask在html页面上显示图像[重复]

    这个问题在这里已经有答案了 我正在尝试传递图像的文件名并将其渲染在模板上 尽管我传递了实际名称 但它不会显示在页面上 app route methods GET POST app route start methods GET POST d
  • 如果在 runAsync 调用之后链接,那么 thenRunAsync(与 thenRun 相对)是否有任何区别?

    在下面的代码中 调用有什么区别吗thenRunAsync 我应该打电话吗thenRun反而 CompletableFuture runAsync this doWork executorService thenRunAsync this h
  • PHP同名变量

    我正在尝试将我用 PHP 制作的登录系统与 PHPBB 登录系统集成 我的问题是我包含了 PHP 登录文档 其中包含一个名为 user但我的登录系统使用 user以及 例如 我的登录函数在名为 user 的类中执行 而 phpbb 登录类是
  • 推荐的拆分 Maven 项目的解决方案?

    在 Maven 中拆分大型企业项目的最佳方式是什么 很容易理解如何像这样垂直划分事物 你有一个 DAO 项目 DAO 项目是一个依赖项 服务项目 Service 项目是一个依赖项 的网络项目 有没有人对 Maven m 中大型项目的分区 拆
  • 并行异步调用时如何获取最大出站请求?

    通过 Fiddler 分析下面的代码 我意识到使用并行扩展我最多可以获得 2 个出站请求 new string http stackoverflow com http superuser com http serverfault com h
  • 对于密集负载应用程序来说,.Net 4.5 中的 async HttpClient 是一个糟糕的选择吗?

    我最近创建了一个简单的应用程序 用于测试可以以异步方式生成的 HTTP 调用吞吐量与经典多线程方法的比较 该应用程序能够执行预定义数量的 HTTP 调用 并在最后显示执行这些调用所需的总时间 在我的测试期间 所有 HTTP 调用都是对我的本
  • 使用函数而不调用模块[重复]

    这个问题在这里已经有答案了 我将 Canopy 与 Jupyter 笔记本一起使用 我想知道是否有一种方法可以使用模块中的函数而无需调用模块 例如 如果我有 import numpy as np print np sin 2 我希望能够只输
  • 可可移动鼠标

    我正在 Snow Leopard 上编写 Mac OS X 应用程序 我有一个由 NSTimer 定期触发的步骤方法 在这种方法中 我想将鼠标移动到屏幕中央 不按下或释放任何按钮 这是我所拥有的 void step NSTimer time
  • Python 的 os.system() 是否等待进程结束?

    The Python手册 http docs python org library os html os system没有提及是否os system cmd 等待或不等待进程结束 引用手册 在子 shell 中执行命令 字符串 看起来它确实
  • 明天的 Wiki 应包含哪些功能? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 明天的 wiki 应该包含哪些功能 他们如何整合 AJAX 等 Web 2 0 功能 他们目前还缺少哪些其他功能 做什么you想查看您最喜欢的 Wik
  • TextView 上的 OnClick 事件停止 CardView 上的 RippleEffect

    我在 CardView 中有一个 TextView 通过添加 OnClick 事件并添加属性来在 CardView 上启用 Lollipop 的涟漪效果时 android foreground android attr selectable
  • 如何使用FastAPI返回JSON格式的数据?

    我在两者中编写了具有相同功能的相同 API 应用程序FastAPI and Flask 但是 当返回 JSON 时 两个框架之间的数据格式不同 两者使用相同的json库 甚至相同的代码 import json from google clo
  • 为什么 PyLint 会警告没有 __init__ ?

    我们有许多似乎不需要的Python类 init 将它们初始化为空是完全可以接受的 甚至是更好的选择 PyLint 似乎认为这是一件坏事 我是否错过了一些关于为什么没有的见解 init 是难闻的气味吗 或者我应该压制这些警告并克服它 你用这些
  • 如何进行C++对齐数组分配?

    我想修改数组分配 float a new float n 使用对齐的分配器 我倾向于尝试使用placement new 和 posix memalign 或新的 c 11 等效项 但请注意数组的新放置对于数组分配来说是有问题的 https