小编Sha*_*mer的帖子

我是通过声明变量全局而不是将它们作为参数传递来节省MATLAB中的内存吗?

我是MATLAB的新手,它不在工作描述中,我被迫接管编写和维护我公司使用的代码的人.生活很艰难.

我接手的人告诉我,他宣称所有的大数据向量都是global为了节省内存.更具体地说,当一个函数调用另一个函数时,他在传递数据时不会创建数据的副本.

这是真的?我阅读了有效使用内存的策略,它说明了这一点

处理大型数据集时,请注意,如果被调用函数修改了其值,MATLAB将生成输入变量的临时副本.这会暂时使存储阵列所需的内存加倍,这会导致MATLAB在没有足够的内存时生成错误.

它说的内存分配对于数组#Function参数非常相似:

将变量传递给函数时,实际上是将引用传递给变量所代表的数据.只要输入数据不被被调用的函数修改,调用函数中的变量和被调用函数中的变量就指向内存中的相同位置.如果被调用函数修改了输入数据的值,则MATLAB将原始数组的副本复制到内存中的新位置,使用修改后的值进行更新,并将调用函数中的输入变量指向此新数组.

那么使用global可以更好吗?似乎有点草率地轻率地声明所有大数据global,而不是确保没有任何代码修改其输入参数.我错了吗?这真的可以改善RAM的使用吗?

matlab memory-management

10
推荐指数
1
解决办法
4118
查看次数

如何使 `target_link_libraries` 依赖项从 cmake 中的 OBJECT 库传递?

OBJECT如果我在 CMake 中指定库的依赖关系链,则target_link_libraries目标可执行文件中仅使用最后一个库的依赖关系。

最小示例:

main取决于objB,取决于objA。和objA都是CMake 中objBOBJECT库。

我希望main链接两个目标文件。事实并非如此。

cmake_minimum_required(VERSION 3.13)
project(transitive-object-library-link-issue VERSION 1.0.0 LANGUAGES C)

add_library(objA OBJECT a.c)

add_library(objB OBJECT b.c)
target_link_libraries(objB PUBLIC objA)

# Should link with 'a.o', since 'objA' is "linked" by 'objB'
add_executable(main main.c)
target_link_libraries(main objB)
Run Code Online (Sandbox Code Playgroud)

注意:可在https://github.com/scraimer/cmake-transitive-object-library-link-issue获取工作文件集

如果我更改objA为非OBJECT库,则可以通过摆脱OBJECT库依赖链来消除问题。换句话说,改变线路

add_library(objA OBJECT a.c)
Run Code Online (Sandbox Code Playgroud)

成为:

add_library(objA a.c)
Run Code Online (Sandbox Code Playgroud)

所以这是OBJECT图书馆特有的东西。我应该如何指定要链接的依赖mainobjA?(无需objA在每个使用的可执行目标中指定objB

cmake

9
推荐指数
2
解决办法
3027
查看次数

项目花费多少时间和精力来实现向后兼容?

鉴于每个软件项目只有如此多的程序员专用时间,您将花多少钱来确保产品向后兼容以前的版本?实际上有几点需要考虑:

  • 软件的使用年限会影响您的决定吗?当程序较新时,您是否会减少向后兼容的时间?
  • 决定是否仅基于已安装副本的客户端数量?
  • 您是否积极努力生成支持未来变更的代码和文件格式?
  • 在开发v1.0时,您是否尝试构建以使v2.0更容易向后兼容v1.0?(留下"保留"字段就是一个例子.)
  • 你如何决定"不,我们不再支持那个"功能?

project-management backwards-compatibility

8
推荐指数
1
解决办法
590
查看次数

为什么UInt16阵列似乎比int数组更快?

似乎C#在添加两个数组时UInt16[]比在添加两个数组时更快int[].这对我来说没有意义,因为我会假设数组是字对齐的,因此int[]需要较少的CPU工作,不是吗?

我运行下面的测试代码,得到以下结果:

Int    for 1000 took 9896625613 tick (4227 msec)
UInt16 for 1000 took 6297688551 tick (2689 msec)
Run Code Online (Sandbox Code Playgroud)

测试代码执行以下操作:

  1. 创建两个名为aand的数组b,一次.
  2. 用随机数据填充它们一次.
  3. 启动秒表.
  4. 添加ab逐项添加.这样做了1000次.
  5. 停止秒表.
  6. 报告花了多长时间.

这是为了int[] a, b和为UInt16 a,b.而每次我运行的代码时,为测试UInt16阵列需要30%不到的时间-50%int阵列.你能解释一下吗?

这是代码,如果你想尝试自己:

public static UInt16[] GenerateRandomDataUInt16(int length)
{
    UInt16[] noise = new UInt16[length];
    Random random = new Random((int)DateTime.Now.Ticks);
    for (int i = 0; i < length; ++i)
    { …
Run Code Online (Sandbox Code Playgroud)

.net c# arrays clr

8
推荐指数
1
解决办法
1105
查看次数

如果没有更多引用,如何从缓存中删除智能指针?

我一直在尝试使用智能指针来升级现有的应用程序,而我正试图克服一个难题.在我的应用程序中,我有一个对象缓存,例如我们称之为书籍.现在,这些书籍缓存是由ID请求的,如果它们在缓存中,则返回它们,如果不是,则从外部系统请求对象(慢速操作)并将其添加到缓存中.一旦进入缓存,可以在应用程序中打开许多窗口,每个窗口都可以参考该书.在以前版本的应用程序中,程序员必须维护AddRef和Release,当每个使用Book对象的窗口关闭时,最终Release(在缓存管理器上)将从缓存中删除对象并删除对象.

您可能已经在链中发现了弱链接,当然程序员记得要调用AddRef和Release.现在我已经转向智能指针(boost :: intrusive)我不再需要担心调用AddRef和Release.然而,这会导致问题,缓存具有对对象的引用,因此当最终窗口关闭时,不通知缓存没有其他人持有引用.

我的第一个想法是定期遍历缓存并清除引用计数为1的对象.我不喜欢这个想法,因为它是一个N阶操作并且感觉不对.我想出了一个回调系统,这个系统更好但不是很棒.我已经包含了回调系统的代码,但我想知道是否有人有更好的方法这样做?

class IContainer
{
public:
    virtual void FinalReference(BaseObject *in_obj)=0;
};

class BaseObject 
{
    unsigned int m_ref;

public:
    IContainer *m_container;

    BaseObject() : m_ref(0),m_container(0)
    {
    }

    void AddRef()
    {
        ++m_ref;
    }
    void Release()
    {
        // if we only have one reference left and we have a container
        if( 2 == m_ref && 0 != m_container )
        {
            m_container->FinalReference(this);
        }

        if( 0 == (--m_ref) )
        {
            delete this;
        }
    }
};

class Book : public BaseObject
{
    char *m_name; …
Run Code Online (Sandbox Code Playgroud)

c++ boost caching pointers smart-pointers

7
推荐指数
1
解决办法
1145
查看次数

临时将目录添加到Windows 7的DLL搜索路径

我想暂时将目录添加到DLL搜索路径 - 在Windows 7下有正确的方法吗?

脚本

我有一个C#应用程序,我们称之为WonderApp.

WonderApp需要调用位于的C++ DLL C:\MyPath.因此,作为WonderApp的一部分Program.Main(),我添加了以下命令:

Environment.SetEnvironmentVariable("PATH",
   "C:\\MyPath;" + Environment.GetEnvironmentVariable("PATH"));
Run Code Online (Sandbox Code Playgroud)

根据这篇文章,添加一个目录PATH也应该将它添加到目录搜索DLL.

该解决方案在Windows XP中运行良好:如果我将目录添加到PATH,则加载DLL并且程序运行正常.如果我不添加目录,则DLL不会加载,失败并显示"未找到"错误.

但是,这不适用于Windows 7.

所以我想,让我们试试吧SetDllDirectory().像这样:

[System.Runtime.InteropServices.DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetDllDirectory(string lpPathName);
Run Code Online (Sandbox Code Playgroud)

后来:

 bool success = SetDllDirectory(Util.Paths.GetApplicationDataDir());
Run Code Online (Sandbox Code Playgroud)

的价值successtrue,但DLL仍然不能加载.

最后,如果我在运行应用程序之前手动设置PATH为包含C:\MyPath- 它一切正常!DLL加载,运行得很好.

所以,要重新迭代:

是否有正确的方法将目录临时添加到Windows 7下的DLL搜索路径?

更新:使用Process Explorer,我检查了应用程序的运行时环境,"C:\ MyPath"确实在PATH!此外,我看到它Helper.dll位于打开句柄列表中(作为DLL,而不仅仅是文件) - 它仍然声称没有找到它.

c# dllimport windows-7

7
推荐指数
1
解决办法
5502
查看次数

当我想使用数据库约束但只标记为已删除而不是删除时该怎么办?

我正在一个项目中工作,其中数据库项目未被删除,但仅标记为已删除.像这样的东西:

id   name     deleted
---  -------  --------
1    Thingy1  0
2    Thingy2  0
3    Thingy3  0
Run Code Online (Sandbox Code Playgroud)

我希望能够在name列上定义类似UNIQUE约束的内容.看起来很简单吧?

让我们假设一个场景,其中"Thingy3"被删除,并创建一个新的(可能在几年后).我们得到:

id   name     deleted
---  -------  --------
1    Thingy1  0
2    Thingy2  0
3    Thingy3  1
...
100  Thingy3  0
Run Code Online (Sandbox Code Playgroud)

从用户的角度来看,他删除了一个项目并创建了一个新项目.就像删除文件和创建新文件一样.因此,对他来说很明显,新项目与连接到旧项目的任何数据无关且未附加.

这已经处理完了,因为DB只关心它id,并且由于新项目的数量id为100而不是3,它们完全不同.

当我想阻止用户创建另一个 "Thingy3"项时,我的困难就出现了.如果我有一个UNIQUE约束只查看未标记的项目deleted,那么我会解决一个问题.

(当然,那时我必须处理当有人撤消删除时会发生什么......)

那么,我该如何定义那种约束呢?

sql t-sql sql-server-2005 constraints

6
推荐指数
1
解决办法
1076
查看次数

Perl的$*变量曾经做过什么?

我有一些来自http://www.hyllander.org/node/23的代码使用$*("美元星号"或"美元星"),但我的perl版本报告:

$* is no longer supported at migrate.pl line 284.
Run Code Online (Sandbox Code Playgroud)

你知道做什么的副作用吗?

$*=1
Run Code Online (Sandbox Code Playgroud)

这是否会以某种方式影响函数split或标记符或正则表达式?

perl predefined-variables

6
推荐指数
1
解决办法
3002
查看次数

找出jQuery动画的CSS属性

我看到它会$element.is(':animated')告诉我$ element是否正在动画,但是有可能看到哪些css属性正在被动画化.

javascript jquery

6
推荐指数
1
解决办法
110
查看次数

使用 g++ 编译 Linux 内核

我想使用g++编译Linux内核(用c编写)。这可能吗?如果没有,您能建议实现它的方法吗?

linux-kernel

5
推荐指数
1
解决办法
1304
查看次数